从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!

尽管如此,请注意matrix-subsetting,因为你最终可能会得到一个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 )

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

警告:

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


使用data.frame时,发布的答案非常好。 但是,从内存的角度来看,这些任务可能相当低效。 使用大量数据时,删除列可能需要非常长的时间和/或由于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

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

链接地址: http://www.djcxy.com/p/70893.html

上一篇: Remove an entire column from a data.frame in R

下一篇: Remove rows with NAs (missing values) in data.frame