누구나 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
두 번째 열을 제거하고 싶습니다.
답변
로 설정할 수 있습니다 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
답변
이름으로 하나 이상의 열을 제거하려면 열 이름을 알고있을 때 (런타임에서 결정되는 것이 아니라) subset()
구문이 좋습니다. 예를 들어 데이터 프레임
df <- data.frame(a=1:3, d=2:4, c=3:5, b=4:6)
a
할 수 있는 열만 제거하십시오.
Data <- subset( Data, select = -a )
할 수 있는 b
및 d
열 을 제거하기 위해
Data <- subset( Data, select = -c(d, b ) )
당신은 사이의 모든 열을 제거 할 수 있습니다 d
와 b
함께 :
Data <- subset( Data, select = -c( d : b )
위에서 말했듯이이 구문은 열 이름이 알려진 경우에만 작동합니다. 열 이름이 프로그래밍 방식으로 결정된 경우 (즉, 변수에 할당 된 경우) 작동하지 않습니다. ?subset
설명서 에서이 경고를 재현하겠습니다 .
경고:
대화식으로 사용하기위한 편리한 기능입니다. 프로그래밍의 경우 ‘[‘와 같은 표준 하위 설정 기능을 사용하는 것이 좋으며, 특히 ‘subset’인수의 비표준 평가는 예상치 못한 결과를 초래할 수 있습니다.
답변
(완전성을 위해) 이름별로 열을 제거하려면 다음을 수행하십시오.
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
열이 하나만 남아 있어도 결과가 여전히 균일합니다.
답변
게시 된 답변은 data.frame
s로 작업 할 때 매우 좋습니다 . 그러나 이러한 작업은 메모리 측면에서 비효율적 일 수 있습니다. 큰 데이터의 경우 열을 제거하는 데 시간이 오래 걸리거나 오류로 인해 실패 할 수 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
차이점을 보여주기 위해 더 큰 예를 모아야합니다. 나는이 답변을 어느 시점에서 업데이트 할 것입니다.
답변
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
답변
이것으로 당신은를 제거하고 다른 것으로 column
저장할 수 있습니다 .variable
variable
df = subset(data, select = -c(genome) )