从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 )
并删除你可以做的b
和d
列
Data <- subset( Data, select = -c(d, b ) )
您可以删除d
和b
之间的所有列:
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) )