【问题标题】:Remove columns with dplyr [duplicate]使用 dplyr 删除列 [重复]
【发布时间】:2023-03-09 05:05:02
【问题描述】:

我有兴趣简化使用 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 中的每个列名查找整数位置。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    使用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
    

    【讨论】:

    • 感谢您的提示!这是我从未使用过的 purrr 功能。
    【解决方案2】:

    您可以将-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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-22
      • 2018-04-07
      • 2020-07-06
      • 2018-01-29
      • 2016-10-04
      • 2019-10-29
      • 1970-01-01
      • 2021-09-24
      相关资源
      最近更新 更多