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

Nan*_*ami 253 r dataframe

有谁知道如何从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
Run Code Online (Sandbox Code Playgroud)

我想删除第二列.

Jos*_*ich 389

您可以将其设置为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
Run Code Online (Sandbox Code Playgroud)

正如评论中指出的,这里还有其他一些可能性:

Data[2] <- NULL    # Wojciech Sobala
Data[[2]] <- NULL  # same as above
Data <- Data[,-2]  # Ian Fellows
Data <- Data[-2]   # same as above
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式删除多列:

Data[1:2] <- list(NULL)  # Marek
Data[1:2] <- NULL        # does not work!
Run Code Online (Sandbox Code Playgroud)

但是要小心矩阵子集,因为你最终可以得到一个向量:

Data <- Data[,-(2:3)]             # vector
Data <- Data[,-(2:3),drop=FALSE]  # still a data.frame
Run Code Online (Sandbox Code Playgroud)

  • 或者您可以使用:数据< - 数据[, - 2] (48认同)
  • 小提示:删除多列时,需要数据[c(1,2)] < - list(NULL)`. (11认同)
  • @mdsumner`Data [-2]`不需要`drop`参数因为它总是从`data.frame`返回`data.frame`.我认为这对于`data.frame`中的本地化列(以及仅列)来说是更好的方法(并且它更快).检查:`cars [-1]`(一个col`data.frame`)或更好的`cars [ - (1:2)]`:`数据帧有0列和50行`. (3认同)
  • 使用逗号,您还可以控制"drop"参数,当FALSE表示data.frame在结果只包含一列时保留data.frame - 没有逗号,您将始终获得data.frame,无论多列是对于[-2]提取,忽略左边或只有一个 - 丢弃 (2认同)

Pra*_*ani 64

要按名称删除一个或多个列,当列名称已知时(而不是在运行时确定),我喜欢subset()语法.例如,对于数据框架

df <- data.frame(a=1:3, d=2:4, c=3:5, b=4:6)
Run Code Online (Sandbox Code Playgroud)

只删除a你可以做的列

Data <- subset( Data, select = -a )
Run Code Online (Sandbox Code Playgroud)

并删除你可以做的bd

Data <- subset( Data, select = -c(d, b ) )
Run Code Online (Sandbox Code Playgroud)

您可以删除之间d和之间的所有列b:

Data <- subset( Data, select = -c( d : b )
Run Code Online (Sandbox Code Playgroud)

如上所述,此语法仅在列名称已知时才有效.如果以编程方式确定列名(即分配给变量),则无效.我将从?subset文档中重现此警告:

警告:

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


cei*_*cat 23

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

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]
Run Code Online (Sandbox Code Playgroud)

包括drop = F确保data.frame只剩下一列时结果仍然是偶数.


Cha*_*ase 21

使用data.frames 时,发布的答案非常好.但是,从内存的角度来看,这些任务可能效率很低.对于大数据,删除列可能会花费非常长的时间和/或由于out of memory错误而失败.包data.table有助于解决:=运营商的这个问题:

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

我应该把一个更大的例子放在一起来表明这些差异.我会在某个时候更新这个答案.

  • 可以在`data.frame`上使用`data.table :: set`函数来立即删除或修改列,而无需复制.见[here](http://stackoverflow.com/questions/17891519/is-it-possible-to-modify-a-data-frame-in-place-destructively/17891970#17891970) (3认同)

sbh*_*bha 7

有几个选项可用于删除带有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 
Run Code Online (Sandbox Code Playgroud)

您还可以按列号删除:

starwars %>% 
  select(-2, -(4:10)) # column 2 and columns 4 through 10
Run Code Online (Sandbox Code Playgroud)


小智 5

有了这个,您可以删除column并将其存储variable到另一个variable

df = subset(data, select = -c(genome) )
Run Code Online (Sandbox Code Playgroud)