有人知道如何从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
我想去掉第二列。
发布的答案在使用data.frames时非常好。然而,从内存的角度来看,这些任务的效率非常低。对于大数据,删除列可能需要异常长的时间和/或由于内存不足错误而失败。包数据。Table使用:=操作符帮助解决这个问题:
library(data.table)
> dt <- data.table(a = 1, b = 1, c = 1)
> dt[,a:=NULL]
b c
[1,] 1 1
我应该用一个更大的例子来说明差异。我会在某个时候更新这个答案。
发布的答案在使用data.frames时非常好。然而,从内存的角度来看,这些任务的效率非常低。对于大数据,删除列可能需要异常长的时间和/或由于内存不足错误而失败。包数据。Table使用:=操作符帮助解决这个问题:
library(data.table)
> dt <- data.table(a = 1, b = 1, c = 1)
> dt[,a:=NULL]
b c
[1,] 1 1
我应该用一个更大的例子来说明差异。我会在某个时候更新这个答案。
要按名称删除一个或多个列,如果列名是已知的(而不是在运行时确定的),我喜欢使用子集()语法。例如,对于数据帧
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 )
如上所述,此语法仅在列名已知的情况下有效。当以编程方式确定列名(即赋值给变量)时,它将不起作用。我将从?子集文档中复制这个警告:
警告:
这是一个方便交互使用的功能。
对于编程,最好使用标准子集
像'['这样的函数,特别是非标准求值
的论点“子集”可能会产生意想不到的后果。
您可以将其设置为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