首页 文章

使用dplyr删除列[重复]

提问于
浏览
1

这个问题在这里已有答案:

我有兴趣简化使用dplyr删除列的方式(版本> = 0.7) . 假设我有一个名字的字符向量 .

drop <- c("disp", "drat", "gear", "am")

选择列

使用dplyr的current version版本,您可以执行以下选择:

dplyr::select(mtcars, !! rlang::quo(drop))

或者更简单的基础R:

mtcars[, drop]

删除列

删除列名称是另一回事 . 我们可以使用每个未加引号的列名来删除它们:

dplyr::select(mtcars, -disp, -drat, -gear, -am)

但是,如果你有一个包含数百列的data.frame,这不是一个很好的解决方案 . 我所知道的最佳解决方案是使用:

dplyr::select(mtcars, -which(names(mtcars) %in% drop))

这很简单,适用于dplyr和base R.但是,我想知道是否有一种方法不涉及在data.frame中为每个列名找到整数位置 .

2 回答

  • 3

    使用 modify_at 并将列设置为 NULL ,这将删除它们:

    mtcars %>% modify_at(drop,~NULL)
    #                    mpg cyl  hp    wt  qsec vs carb
    # Mazda RX4         21.0   6 110 2.620 16.46  0    4
    # Mazda RX4 Wag     21.0   6 110 2.875 17.02  0    4
    # Datsun 710        22.8   4  93 2.320 18.61  1    1
    # Hornet 4 Drive    21.4   6 110 3.215 19.44  1    1
    # Hornet Sportabout 18.7   8 175 3.440 17.02  0    2
    # Valiant           18.1   6 105 3.460 20.22  1    1
    # ...
    

    更接近您的尝试,您可以尝试 magrittr::extract 而不是 dplyr::select

    extract(mtcars,!names(mtcars) %in% drop) # same output
    
  • 1

    您可以将 -one_of(drop)select 一起使用:

    drop <- c("disp", "drat", "gear", "am")
    select(mtcars, -one_of(drop)) %>% names()
    # [1] "mpg"  "cyl"  "hp"   "wt"   "qsec" "vs"   "carb"
    

    one_of 将字符向量中的列名称计算为整数,类似于 which(... %in% ...)

    one_of(drop, vars = names(mtcars))
    # [1]  3  5 10  9
    
    which(names(mtcars) %in% drop)
    # [1]  3  5  9 10
    

相关问题