基于那些在R数据帧选择列*不是在向量*(Selecting columns in R data fr

2019-06-17 22:32发布

我熟悉能够提取从R的数据帧(或矩阵)的列如下所示:

df.2 <- df[, c("name1", "name2", "name3")]

但是,可以使用一个! 或其它工具选择所有,但那些列出的列

有关背景,我有相当多的列向量数据帧和我想避免:

  • 打字了大多数的名字时,我可以只取出一小
  • 使用短得多df.2 <- df[, c(1,3,5)]因为当我的.csv文件的变化,我的代码去赫克因为编号是不一样了。 我是新来的R和想到我学到了艰辛的道路不使用数字矢量较大的DF的可能改变。

我试过了:

df.2 <- df[, !c("name1", "name2", "name3")]
df.2 <- df[, !=c("name1", "name2", "name3")]

而且,正如我在输入这个,发现这个工作:

df.2 <- df[, !names(df) %in% c("name1", "name2", "name3")]

难道还有比这最后一个更好的办法?

Answer 1:

一个替代grepwhich

df.2 <- df[, -which(names(df) %in% c("name1", "name2", "name3"))]


Answer 2:

您可以拨打电话较短,这也是与负的grep更普及:

df.2 <- df[, -grep("^name[1:3]$", names(df) )] 

由于grep的返回NUMERICS可以使用负矢量索引来删除列。 你可以添加更多号码或更为复杂的模式。



Answer 3:

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

否定具体列名,下面滴列“HP”和“QseC的”通过“齿轮”的列:

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

你也可以否定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


Answer 4:

如果你使用它自己使用来操作数据你可以做一个自定义的函数来做到这一点。 我可以做这样的事情:

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)

第一个参数是数据框的名字。 下面...是你想删除任何列的名称。



Answer 5:

旧线,但这里的另一种解决方案:

df.2 <- subset(df, select=-c(name1, name2, name3))

这是(虽然我现在不能找到它)张贴在另一个类似的线程。 应该是你所描述的情况持续代码,可能比一些其他的选择更容易阅读和编辑。



Answer 6:

这使我想到的最简单的方法:

filtered_df <-df [,setdiff(名(DF),C( “NAME1”, “NAME2”)]

基本上你是计算列名的完整列表,你想过滤掉(NAME1和NAME2以上)的子集之间的差集。



文章来源: Selecting columns in R data frame based on those *not* in a vector