R의 data.frame에서 전체 열을 제거하십시오.


267

누구나 R의 data.frame에서 전체 열을 제거하는 방법을 알고 있습니까? 예를 들어이 data.frame이 주어지면 :

> head(data)
   chr       genome region
1 chr1 hg19_refGene    CDS
2 chr1 hg19_refGene   exon
3 chr1 hg19_refGene    CDS
4 chr1 hg19_refGene   exon
5 chr1 hg19_refGene    CDS
6 chr1 hg19_refGene   exon

두 번째 열을 제거하고 싶습니다.


답변:


414

로 설정할 수 있습니다 NULL.

> Data$genome <- NULL
> head(Data)
   chr region
1 chr1    CDS
2 chr1   exon
3 chr1    CDS
4 chr1   exon
5 chr1    CDS
6 chr1   exon

의견에서 지적했듯이 다른 가능성은 다음과 같습니다.

Data[2] <- NULL    # Wojciech Sobala
Data[[2]] <- NULL  # same as above
Data <- Data[,-2]  # Ian Fellows
Data <- Data[-2]   # same as above

다음을 통해 여러 열을 제거 할 수 있습니다.

Data[1:2] <- list(NULL)  # Marek
Data[1:2] <- NULL        # does not work!

벡터로 끝날 수 있으므로 행렬 서브셋에주의하십시오.

Data <- Data[,-(2:3)]             # vector
Data <- Data[,-(2:3),drop=FALSE]  # still a data.frame

48
또는 당신은 사용할 수 있습니다 : Data <-Data [,-2]
Ian Fellows

2
쉼표로 "drop"인수를 제어 할 수도 있습니다. FALSE를 의미 할 때 결과가 하나의 열로만 구성된 경우 data.frame은 data.frame을 유지합니다. 쉼표가 없으면 항상 data.frame을 얻게됩니다. 왼쪽 또는 한 - 드롭은 [-2] 추출 무시
mdsumner

3
@mdsumner은 Data[-2]필요하지 않습니다 drop항상 반환 원인 인수 data.frame에서 data.frame. 그리고 이것이 현지화 된 열 (및 열 만)에 훨씬 더 좋은 방법이라고 생각합니다 data.frame(더 빠릅니다). 확인 : cars[-1](한 열 data.frame) 이상 cars[-(1:2)]: data frame with 0 columns and 50 rows.
Marek

1
Data [2] <-NULL
Wojciech Sobala

11
작은 팁 : 여러 열을 제거해야 할 때 Data[c(1,2)]<-list(NULL).
Marek

69

이름으로 하나 이상의 열을 제거하려면 열 이름을 알고있을 때 (런타임에서 결정되는 것이 아니라) subset()구문이 좋습니다. 예를 들어 데이터 프레임

df <- data.frame(a=1:3, d=2:4, c=3:5, b=4:6)

a할 수 있는 열만 제거하십시오.

Data <- subset( Data, select = -a )

할 수 있는 bd열 을 제거하기 위해

Data <- subset( Data, select = -c(d, b ) )

당신은 사이의 모든 열을 제거 할 수 있습니다 db함께 :

Data <- subset( Data, select = -c( d : b )

위에서 말했듯이이 구문은 열 이름이 알려진 경우에만 작동합니다. 열 이름이 프로그래밍 방식으로 결정된 경우 (즉, 변수에 할당 된 경우) 작동하지 않습니다. ?subset설명서 에서이 경고를 재현하겠습니다 .

경고:

대화식으로 사용하기위한 편리한 기능입니다. 프로그래밍의 경우 '['와 같은 표준 하위 설정 기능을 사용하는 것이 좋으며, 특히 'subset'인수의 비표준 평가는 예상치 못한 결과를 초래할 수 있습니다.


26

(완전성을 위해) 이름별로 열을 제거하려면 다음을 수행하십시오.

cols.dont.want <- "genome"
cols.dont.want <- c("genome", "region") # if you want to remove multiple columns

data <- data[, ! names(data) %in% cols.dont.want, drop = F]

포함 drop = F하면 data.frame열이 하나만 남아 있어도 결과가 여전히 균일합니다.


22

게시 된 답변은 data.frames로 작업 할 때 매우 좋습니다 . 그러나 이러한 작업은 메모리 측면에서 비효율적 일 수 있습니다. 큰 데이터의 경우 열을 제거하는 데 시간이 오래 걸리거나 오류로 인해 실패 할 수 out of memory있습니다. 패키지 data.table:=연산자 로이 문제를 해결하는 데 도움이됩니다 .

library(data.table)
> dt <- data.table(a = 1, b = 1, c = 1)
> dt[,a:=NULL]
     b c
[1,] 1 1

차이점을 보여주기 위해 더 큰 예를 모아야합니다. 나는이 답변을 어느 시점에서 업데이트 할 것입니다.


3
data.table::set기능을 사용 data.frame하여 복사하지 않고 열을 즉시 제거하거나 수정할 수 있습니다 . 여기를
G

8

dplyr::select()일부 도우미 함수 를 사용하여 하나 이상의 열을 제거하기위한 여러 옵션이 있습니다 . 헬퍼 함수는 일부 특정 열의 이름을 지울 필요가 없기 때문에 유용 할 수 있습니다. 열을 사용하여 삭제 하려면 행 이름을 무효화 select()하기 위해 행간 -을 사용해야 합니다.

사용하여 dplyr::starwars다양한 컬럼 이름에 대한 샘플 데이터 :

library(dplyr)

starwars %>% 
  select(-height) %>%                  # a specific column name
  select(-one_of('mass', 'films')) %>% # any columns named in one_of()
  select(-(name:hair_color)) %>%       # the range of columns from 'name' to 'hair_color'
  select(-contains('color')) %>%       # any column name that contains 'color'
  select(-starts_with('bi')) %>%       # any column name that starts with 'bi'
  select(-ends_with('er')) %>%         # any column name that ends with 'er'
  select(-matches('^v.+s$')) %>%       # any column name matching the regex pattern
  select_if(~!is.list(.)) %>%          # not by column name but by data type
  head(2)

# A tibble: 2 x 2
homeworld species
  <chr>     <chr>  
1 Tatooine  Human  
2 Tatooine  Droid 

열 번호로 삭제할 수도 있습니다.

starwars %>% 
  select(-2, -(4:10)) # column 2 and columns 4 through 10

좋은 대답입니다. 행에서 특정 값을 포함하는 열을 삭제하는 방법에 대한 아이디어가 있습니까 (위에서 제안한 열 이름이 아님)?
Laura K

df [,-which (sapply (df, function (x) any (x == a)))], 여기서 df는 데이터 프레임이고 a는 특정 값입니다. 예 : mtcars [,-which (sapply (mtcars, function (x) any (x == 4)))]
나나미

7

이것으로 당신은를 제거하고 다른 것으로 column저장할 수 있습니다 .variablevariable

df = subset(data, select = -c(genome) )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.