[英]Remove an entire column from a data.frame in R
有谁知道如何从 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
文档中重现此警告:
警告:
这是一个方便的 function 用于交互使用。 对于编程,最好使用像“[”这样的标准子集函数,特别是参数“子集”的非标准评估可能会产生意想不到的后果。
(为了完整性)如果要按名称删除列,可以这样做:
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
时,发布的答案非常好。 但是,从 memory 的角度来看,这些任务可能效率很低。 对于大数据,删除列可能会花费异常长的时间和/或由于out of memory
错误而失败。 Package 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) )
使用 dplyR,以下工作:
data <- select(data, -genome)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.