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

Remove an entire column from a data.frame in R

提问人:Nanami 提问时间:6/9/2011 最后编辑:zx8754Nanami 更新时间:10/3/2023 访问量:1281074

问:

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

我想删除第二列。

数据帧 R-常见问题解答

评论

2赞 jangorecki 12/9/2015
R 数据帧中 Drop 列的可能重复项

答:

490赞 Joshua Ulrich 6/9/2011 #1

您可以将其设置为 。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

评论

59赞 Ian Fellows 6/9/2011
或者您可以使用:Data <- Data[,-2]
2赞 mdsumner 6/9/2011
使用逗号,您还可以控制“drop”参数,当 FALSE 表示 data.frame 在结果仅包含一列时保持 data.frame - 如果没有逗号,无论留下多列还是只剩下一列,您都将始终获得 data.frame - [-2] 提取忽略 drop
3赞 Marek 6/9/2011
@mdsumner不需要参数,因为它总是从 返回。我认为这是本地化列(并且仅列)的更好方法(而且速度更快)。检查:(一列)或更好:。Data[-2]dropdata.framedata.framedata.framecars[-1]data.framecars[-(1:2)]data frame with 0 columns and 50 rows
1赞 Wojciech Sobala 6/9/2011
您也可以将 Data[2] <- NULL 写入
13赞 Marek 6/9/2011
小提示:当需要删除多列时。Data[c(1,2)]<-list(NULL)
86赞 Prasad Chalasani 6/9/2011 #2

要按名称删除一列或多列,当列名已知时(而不是在运行时确定),我喜欢语法。例如,对于数据帧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 ) )

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

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

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

警告:

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

24赞 Chase 7/20/2012 #3

使用 s 时,发布的答案非常好。但是,从内存的角度来看,这些任务可能非常低效。对于大数据,删除列可能需要异常长的时间和/或由于错误而失败。软件包有助于解决操作员的此问题:data.frameout of memorydata.table:=

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

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

评论

3赞 GSee 8/9/2014
该函数可以在 s 上使用,以立即删除或修改列,而无需进行复制。看这里data.table::setdata.frame
38赞 ceiling cat 6/3/2015 #4

(为完整起见)如果要按名称删除列,可以执行以下操作:

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]

Include 可确保即使只剩下一列,结果仍为 a。drop = Fdata.frame

12赞 Nirali Khoda 8/4/2017 #5

有了这个,您可以删除并存储到另一个 .columnvariablevariable

df = subset(data, select = -c(genome) )
12赞 sbha 3/20/2019 #6

有几个选项可用于删除一个或多个带有帮助程序函数的列和一些帮助程序函数。帮助程序函数可能很有用,因为有些函数不需要命名要删除的所有特定列。请注意,要删除列,您需要使用前导来否定列名。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

评论

0赞 Laura K 6/19/2019
很好的答案。关于如何删除在其任何行中包含特定值的列(而不是您上面建议的列名称)的任何想法?
0赞 Nanami 7/31/2019
df[,-which(sapply(df, function(x) any(x == a)))],其中 df 是您的数据框,a 是您的特定值,例如: mtcars[,-which(sapply(mtcars, function(x) any(x==4)))]
2赞 DonCarleone 8/31/2022 #7

使用 dplyR,以下工作原理:

data <- select(data, -genome)

根据此处找到的文档 https://www.marsja.se/how-to-remove-a-column-in-r-using-dplyr-by-name-and-index/#:~:text=select(starwars%2C%20%2Dheight)

1赞 John 11/11/2022 #8

我只是想在尚未提及的内容中添加一个。这很简单,但也很有趣,因为在我浏览互联网时,我没有看到它,尽管高度相关的 %in% 出现在许多地方。

df <- df[ , -which(names(df) == 'removeCol')]

此外,我没有看到任何人发布 grep 替代品。这些对于删除与模式匹配的多个列非常方便。

评论

0赞 Rémi Maglione 7/29/2023
有了逻辑,也可以df <- df[ , !names(df) == 'removeCol']
0赞 山の平和 10/3/2023 #9

chr = chr[,-2]如果这样做会更容易,只需从 df 中删除第二列并将其再次存储在 df 中即可。