R 데이터프레임 행 삭제 - r deiteopeuleim haeng sagje

이전 포스팅에서는 특정한 열 이름을 바탕으로 해당 열을 데이터 프레임에서 제거하는 것을 연습했다. 이번에는 행을 제거해보고자 한다. 이전 포스팅은 아래 링크를 참조하자.

간혹 데이터 전처리를 하다 보면, 데이터 중간에 NA 즉, 누락된 값이 있는 경우가 있다. 예를 들면 다음과 같은 상황이다.

f = read.csv("test.csv") head(f)

test.csv 파일을 read.csv() 함수로 불러들여 와서 head() 함수로 앞쪽만 살펴보면, 위와 같은 결과를 볼 수 있다. 이렇게 앞 부분만 봤을 때에는 큰 문제가 없는 것 같지만, 실제로는 데이터 중간에 누락된 정보가 있을 수도 있다.

물론 열에 있는 값의 성질에 따라서 NA도 품을 수 있는 상황이라면 상관없겠지만, 아예 전체 열의 값이 NA가 된 경우도 있고, 아니면 특정 값은 NA가 있으면 해당 데이터 자체가 필요가 없어 지는 경우가 있다. 그래서 이것을 잡아내서 해당 행만 데이터 프레임에서 제거하는게 좋다.

우선 위의 테스트 데이터에서는 아래와 같이 1636번째 행부터 NA값이 보이기 시작한다. 누가봐도 누락된 데이터이기 때문에 이부분은 모조리 제거해야 겠다.

그러면 특정한 열에서만 NA가 있는게 아니라, 모든열에서 동일하게 NA라는 가정하에 ID를 기준으로 NA가 포함된 행을 찾아보겠다. 이렇게 특정한 조건을 만족하는 경우에만 해당 행을 택하는 것을 R에서는 subset() 이라는 함수로 손쉽게 할 수 있다. 여기서는 우선 f라는 타겟이 되는 데이터 프레임을 먼저 첫 번째 인수로 넣는다.

그리고는 동일하게 TRUE와 FALSE로 된 벡터를 넣어서 원하는 행만 취할 수 있다. 이번에는 is.na() 함수를 사용해서 NA가 있는 곳에 TRUE를 넣었다. is.na()와 같은 기본 함수에 대해서는 아래 포스팅을 참조하자.

그러면 NA가 있는 곳에 TRUE가 있으니, 반대로 하려면 !를 앞에 넣어서 NA가 아닌 곳에서의 인덱스만 TRUE로 한다. 해당 T/F 로 된 벡터를 subset() 함수의 두 번째 인수로 넣게 되면, 해당 되는 부분만 부분집합으로 취하게 된다.

f = subset(f, !is.na(ID)) f[1630:1640,]

그러고, 앞에서 NA가 있던 부분을 확인해보면 이후의 값으로 채워진 행이 바로 나오는 것을 볼 수 있다.

#열 추가

> x<-cbind(x, 학과=c("경영", "영"))

> x<-cbind(x, 학과=c("경영", "영"))

> x<-cbind(x, 학과=c("경영", "영어"))

> x

    성명 나이 주소 학과 학과 학과

1 홍길동   20 서울 경영 경영 경영

2   둘리   30 대전   영   영 영어

#행 추가

> x<-rbind(x, data.frame(성명="장발장", 나이=40, 주소="파리", 학과="전산학"))

> x

    성명 나이 주소   학과

1 홍길동   20 서울   경영

2   둘리   30 대전   영어

3 장발장   40 파리 전산학

#열 삭제

> x <- x[,-c(4, 5)]

> x

    성명 나이 주소 학과

1 홍길동   20 서울 경영

2   둘리   30 대전 영어

R 데이터프레임 행이름 리셋하는 법

먼저 데이터프레임을 하나 정의합시다. 

a=1:5

b=11:15

c=101:105

mydata=data.frame(a,b,c)

정의한 데이터프레임은 아래와 같습니다. 

> mydata

  a  b   c

1 1 11 101

2 2 12 102

3 3 13 103

4 4 14 104

5 5 15 105

이 데이터프레임의 1,3,5행을 mydata2라는 데이터프레임에 입력하겠습니다. 

mydata2=mydata[c(1,3,5),]

결과는 아래와 같습니다. 행 이름도 1,3,5가 되어 있는 것을 알 수 있습니다. 

> mydata2

  a  b   c

1 1 11 101

3 3 13 103

5 5 15 105

행 이름을 1,2,3으로 리셋하려면, 아래와 같은 코드를 입력하면 됩니다. 

rownames(mydata2)=NULL

행 이름이 리셋됩니다. 

> mydata2

  a  b   c

1 1 11 101

2 3 13 103

3 5 15 105

예전에 subset() 함수를 이용하여 R에서 특정 열을 제거하는 방법을 포스팅 했었습니다.

이번에는 특정 행을 제거 하는 방법에 대해 소개하겠습니다.

위와 같은 데이터가 있습니다. 이 데이터의 이름은 yield 라고 하겠습니다. 3개의 Genotype, CV1, CV2, CV3 로 이루어진 데이터 입니다. 저는 여기서 각각의 Genotype 으로 데이터를 나누고 싶습니다.

cv1<- subset (yield, Genotype=="CV1") cv2<- subset (yield, Genotype=="CV2") cv3<- subset (yield, Genotype=="CV3")

이렇게 코드를 작성하면 3개의 데이터로 나눠집니다.

하지만 만일 CV2 가 포함된 행만 데이터에서 지우고 싶다면 어떻게 해야 할까요?

yield2 <- subset (yield, Genotype!="CV2")

이렇게 코드를 작성하면 CV2 행이 다 제거됩니다.

만일 제거하고 싶은 행이 많을 경우 어떻게 해야 할까요? 실험 데이터를 R에 업로드 하고 나서 보니 CV2, CV6, CV10 데이터에 오류가 있는 것을 발견하고 이 3개의 Genotype 을 삭제하기로 했습니다.

아래와 같이 & 를 이용해서 여러개의 행을 동시에 삭제합니다.

yield3 <- subset (yield, Genotype!="CV2" & Genotype!="CV6" & Genotype!="CV10")

선택한 행이 삭제된 것을 확인할수 있습니다.

Toplist

최신 우편물

태그