我可以像这样选择和重命名列名,没有任何问题:
library(tidyverse)
iris <- as.tibble(iris)
iris %>% select(sepal_ln = Sepal.Length, sepal_wd = Sepal.Width)
#> # A tibble: 150 × 2
#> sepal_ln sepal_wd
#> <dbl> <dbl>
#> 1 5.1 3.5
#> 2 4.9 3.0
#> 3 4.7 3.2
#> 4 4.6 3.1
#> 5 5.0 3.6
#> 6 5.4 3.9
#> 7 4.6 3.4
#> 8 5.0 3.4
#> 9 4.4 2.9
#> 10 4.9 3.1
#> # ... with 140 more rows
但是我想做的是从字符串而不是列名中调用列。我尝试了以下但失败了:
> wanted <- "Sepal"
> iris %>% select(sepal_ln = !! paste0(wanted,".Length"),
+ sepal_wd = !! paste0(wanted,".Width"),
+ )
Error: "Sepal.Length", "Sepal.Width": must resolve to integer column positions, not string
>
这样做的正确方法是什么?
最佳答案
我们可以使用 select_
iris %>%
select_(sepal_ln = paste0(wanted, ".Length"), paste0(wanted, ".Width"))
此外,
select
中还有包装器。更容易地做到这一点,即 one_of
, contains
, matches
等从数据中选择所需的列iris %>%
select(setNames(one_of(paste0(wanted, c(".Length", ".Width"))),
c("sepal_ln", "sepal_wd"))) %>%
head(2)
# A tibble: 2 × 2
# sepal_ln sepal_wd
# <dbl> <dbl>
#1 5.1 3.5
#2 4.9 3.0
注意:不清楚是否
select_
方法将在下一个 dplyr
中被弃用是否发布( 0.6.0
)。
关于r - 如何使用dplyr基于字符串选择列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43625653/