R에서 특정 열(칼럼)을 선택 혹은 제거하는 방법은 적어도 3~4가지는 되는 것 같습니다. 우선, 데이터프레임을 하나 만들어봅니다.
a <- c(1, 2, 3, 4)
b<-c('apple', 'pear', 'orange', 'banana')
c<-c(TRUE, FALSE, TRUE, FALSE)
df<-data.frame(a, b, c)
names(df)<-c('number', 'fruit', 'TF')
df라는 데이터프레임에 각각 number, fruit, TF라는 칼럼이 있는데, 예를 들어 number을 없애고 싶다 하면, 간단하게 그냥
df$number<-NULL
하거나
df[, 'number']<-NULL
하면 됩니다. NA가 아니라 NULL임을 잊지 마세요. NA는 그냥 missing으로 처리되어서 칼럼 자체는 사라지지 않고 value만 missing으로 처리됩니다.
그런데 만약 복수의 칼럼을 제거(drop)하고 싶다면? 다시 위의 데이터를 복원해서 3개의 칼럼(number, fruit, TF)가 있다고 합시다. 우선 칼럼 번호(index)를 알고 있으면 매우 간단합니다.
df[, 1]
df[, 2:3]
df[, -1]
df[, -(2:3)]
이런 식으로 쓸 수 있죠 df [, 1]은 첫번째 칼럼만 뽑아내라 다시 말해 number 열만 남는 것이고, 맨 마지막에 있는 df [, -(2:3)]은 2, 3열을 '제외'하고 나머지를 뽑아내라는 의미로 결국 number 열만 뽑아내라는 같은 의미를 갖게 됩니다. 마찬가지로 df [, -1]과 df [, 2:3]도 둘 다 fruit과 TF를 뽑아내라, 즉 같은 의미입니다 (칼럼이 3개만 있는 데이터프레임의 경우).
당연히 이름으로도 뽑아낼 수 있는데, 그러나 재미있게도 이름은 - 부호와는 함께 쓰이지 못합니다. 다시 말해, 아래의 경우는 가능하지만
df[, 'fruit']
df[, c('number', 'fruit')]
바로 밑처럼 -와 칼럼 이름이 같이 들어가면 데이터프레임 기본 연산으로는 에러가 생깁니다.
df[, -'fruit']
df[, -c('number', 'fruit')]
그래서 이름을 갖고 뽑을 때 쓸 수 있는 가장 좋은 방법은 결국 subset입니다. 예를 들어 1) fruit 칼럼만 2) fruit, number 칼럼 둘을 뽑고 싶다고 하면 아래처럼 쓰면 되구요 (여기에는 따옴표가 안 들어가는 것에 유의하세요! subset 쓸 때마다 저도 헷갈립니다)
subset(df, select=fruit)
subset(df, select=c(fruit, number))
여기서는 -부호가 칼럼 이름과 같이 사용 가능합니다. 아래 첫번째 경우는 fruit을 제외한 열을 뽑으라는 의미이고, 두번째는 fruit과 number 칼럼을 제외하고 (다시 말해 TF 칼럼만) 뽑으라는 의미입니다.
subset(df, select=-fruit)
subset(df, select=-c(fruit, number))
아 이건 당연한 얘기겠지만 새로 추출한 데이터를 기존 데이터로 덮으려면 <-로 업데이트 해야겠죠? 예를 들어 아래 처럼 말이죠
df<-df[, 1]
df<-subset(df, select=c(number, TF))
이외에도 칼럼 추출 내지는 제거에 쓰일 수 있는 유용한 도구가 dplyr에 있는 select입니다.
예를 들어 칼럼이 10개 인데 그 중 5개의 이름은 a1, a2, a3, a4, a5이고, 나머지는 b1, b2, b3, b4, b5인데 이 중 b로 시작하는 것만 뽑고 나머지는 제거하고 싶다고 하면 아래처럼 하면 됩니다.
library(dplyr)
df %>% select(starts_with("b"))
아니면 a로 시작하는 것만 떨어뜨려도 되죠
df %>% select(-starts_with("a"))
만약에 칼럼 이름이 중구난방이고 일일이 이름보고 뽑고 싶다고 하면 벡터를 따로 만들어서 해주면 됩니다. 예를 들어 R에서 mtcars라는 데이터를 열어서 그 중에 내가 관심 있는 칼럼 4개를 뽑고 싶다고 하면
colnames(mtcars)
mtcars[ , c("cyl", "disp", "am", "gear")]
역으로 위에서 선택한 4개만 '제외'하고 나머지 다 뽑아라 하면
mtcars[ , !colnames(mtcars)%in%c("cyl", "disp", "am", "gear")]
%in%는 앞의 벡터가 뒤의 벡터와 겹치는 부분을 의미합니다. 다시 말해 위의 명령문을 해석하면 "mtcars 모든 칼럼 중에 %in% 이후에 나오는 벡터 4개랑 겹치는 것이 아닌 것(!)을 다 뽑아내라". 이런 의미가 됩니다. colnames대신 names를 써도 무방하구요.
mtcars[ , !names(mtcars)%in%c("cyl", "disp", "am", "gear")]
'R > R basic' 카테고리의 다른 글
이름이 비슷한 csv 파일을 불러서 통합해서 하나의 데이터프레임을 만들 경우 (0) | 2020.05.08 |
---|---|
내가 갖고 있는 데이터의 형태는 데이터프레임인가? (0) | 2020.05.07 |
열(column) 새롭게 추가하기 (0) | 2020.05.03 |
열 (column) 이름 바꾸기: colnames or rename (0) | 2020.05.03 |
[R기본] R로 데이터프레임 만들기, 행&열 뽑기, 부분 집합, 그리고 순서 (0) | 2020.04.26 |