从R中的data.frame中移除整个列

有谁知道如何从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! 

尽pipe如此,请注意matrix子集,因为您最终可能会得到一个vector:

 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 ) 

并删除你可以做的bd

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

您可以删除db之间的所有列:

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

正如我上面所说的,这个语法只有在列名已知时才起作用。 说列名是以编程方式确定的(即分配给一个variables),它将不起作用。 我将从?subset文档重现这个警告:

警告:

这是一个交互式使用的便利function。 对于编程,最好使用像'['这样的标准子集函数,特别是参数'子集'的非标准评估可能会有意想不到的后果。

使用data.frame时,发布的答案非常好。 但是,从内存的angular度来看,这些任务可能相当低效。 使用大量数据时,删除列可能会花费非常长的时间和/或由于out of memory错误而失败。 Package data.table有助于解决这个问题:=运算符:

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

我应该举一个更大的例子来展示差异。 我会在某个时候更新这个答案。

(为了完整性)如果你想通过名称删除列,你可以这样做:

 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

有了这个,你可以删除column和存储variable到另一个variable

 df = subset(data, select = -c(genome) )