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

gj3fmq9x  于 2023-10-13  发布在  其他
关注(0)|答案(9)|浏览(99)

有人知道如何在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

我想去掉第二列

eh57zj3b

eh57zj3b1#

可以设置为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
fquxozlt

fquxozlt2#

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

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文档中复制此警告:
警告:
这是一个用于交互式使用的便利功能。对于编程来说,最好使用标准的子集函数,比如'subset',特别是参数'subset'的非标准评估可能会产生意想不到的后果。

vyswwuz2

vyswwuz23#

(For完整性)如果你想按名称删除列,你可以这样做:

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,即使只剩下一列。

tzxcd3kk

tzxcd3kk4#

在使用data.frame s时,张贴的答案非常好。然而,从记忆的Angular 来看,这些任务可能非常低效。对于大型数据,删除列可能需要非常长的时间和/或由于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

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

ve7v8dk2

ve7v8dk25#

这样,您就可以删除column并将variable存储到另一个variable中。

df = subset(data, select = -c(genome) )
ikfrs5lh

ikfrs5lh6#

使用dplyr::select()和一些helper函数删除一个或多个列有几个选项。helper函数可能很有用,因为有些函数不需要命名要删除的所有特定列。请注意,要删除使用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
bz4sfanl

bz4sfanl7#

使用dashboard R,以下工作:
data <- select(data, -genome)
根据此处的文档https://www.marsja.se/how-to-remove-a-column-in-r-using-dplyr-by-name-and-index/#:starwars%2C%20%2Dheight)

brccelvz

brccelvz8#

我只是想加一个还没提到的。这很简单,但也很有趣,因为在我所有的互联网细读我没有看到它,即使高度相关的%在%出现在许多地方。

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

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

oo7oh9g9

oo7oh9g99#

chr = chr[,-2]如果你这样做会更简单,只需要从df中删除第二列,然后再次将其存储在df中。

相关问题