根据矢量中的*not*选择R数据帧中的列

Hen*_*ndy 40 r subset dataframe

我很熟悉能够从R数据框(或矩阵)中提取列,如下所示:

df.2 <- df[, c("name1", "name2", "name3")]
Run Code Online (Sandbox Code Playgroud)

但是,可以使用一个!或其他工具来选择除列出的列之外的所有列吗?

对于背景,我有一个包含很多列向量的数据框,我想避免:

  • 当我可以删除少数人时,输入大多数名字
  • 使用更短的df.2 <- df[, c(1,3,5)]因为当我的.csv文件发生变化时,我的代码就变成了问题,因为编号不再相同了.我是R的新手,并且认为我已经学会了很难不使用数字向量来获得更大的df.

我试过了:

df.2 <- df[, !c("name1", "name2", "name3")]
df.2 <- df[, !=c("name1", "name2", "name3")]
Run Code Online (Sandbox Code Playgroud)

正如我输入这个,发现这有效:

df.2 <- df[, !names(df) %in% c("name1", "name2", "name3")]
Run Code Online (Sandbox Code Playgroud)

有没有比上一个更好的方法?

har*_*mug 29

另一种选择grepwhich:

df.2 <- df[, -which(names(df) %in% c("name1", "name2", "name3"))]
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 11

您可以使用negative-grep进行更短的调用:

df.2 <- df[, -grep("^name[1:3]$", names(df) )] 
Run Code Online (Sandbox Code Playgroud)

由于grep返回数字,您可以使用负向量索引来删除列.您可以添加更多数量或更复杂的模式.


sbh*_*bha 6

dplyr::select() 有几个删除特定列的选项:

library(dplyr)

drop_columns <- c('cyl','disp','hp')
mtcars %>% 
  select(-one_of(drop_columns)) %>% 
  head(2)

              mpg drat    wt  qsec vs am gear carb
Mazda RX4      21  3.9 2.620 16.46  0  1    4    4
Mazda RX4 Wag  21  3.9 2.875 17.02  0  1    4    4
Run Code Online (Sandbox Code Playgroud)

取消特定的列名称,以下内容将"hp"列和"qsec"中的列从"gear"中删除:

mtcars %>% 
  select(-hp, -(qsec:gear)) %>% 
  head(2)

              mpg cyl disp drat    wt carb
Mazda RX4      21   6  160  3.9 2.620    4
Mazda RX4 Wag  21   6  160  3.9 2.875    4
Run Code Online (Sandbox Code Playgroud)

你也可以否定 contains(),starts_with(),ends_with(),或matches():

mtcars %>% 
  select(-contains('t')) %>%
  select(-starts_with('a')) %>% 
  select(-ends_with('b')) %>% 
  select(-matches('^m.+g$')) %>% 
  head(2)

              cyl disp  hp  qsec vs gear
Mazda RX4       6  160 110 16.46  0    4
Mazda RX4 Wag   6  160 110 17.02  0    4
Run Code Online (Sandbox Code Playgroud)


小智 5

旧线程,但这是另一个解决方案:

df.2 <- subset(df, select=-c(name1, name2, name3))
Run Code Online (Sandbox Code Playgroud)

这是在另一个类似的帖子中发布的(尽管我现在找不到它)。在您描述的情况下应该是可持续的代码,并且可能比其他一些选项更容易阅读和编辑。


Tyl*_*ker 2

如果您使用自定义函数来操作数据,则可以创建一个自定义函数来执行此操作。我可能会做这样的事情:

rm.col <- function(df, ...) {
    x <- substitute(...())
    z <- Trim(unlist(lapply(x, function(y) as.character(y))))
    df[, !names(df) %in% z]
}

rm.col(mtcars, hp, mpg)
Run Code Online (Sandbox Code Playgroud)

第一个参数是数据框名称。以下...是您要删除的任何列的名称。