【问题标题】:selecting column ranges via sym and enquo with dplyr::select使用 dplyr::select 通过 sym 和 enquo 选择列范围
【发布时间】:2019-03-25 21:48:34
【问题描述】:

BLUP:是否可以使用sym/enquo 将列范围传递给dplyr::select

考虑以下包含 A 到 E 列的小标题:

library(tibble)
library(dplyr)
set.seed(4)
d = as_tibble(setNames(as.list(rnorm(5)), LETTERS[1:5]))
d
## # A tibble: 1 x 5
##       A      B     C     D     E
##   <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 0.217 -0.542 0.891 0.596  1.64

我可以使用列运算符: 选择一系列列,例如

select(d, B:D)
## # A tibble: 1 x 3
##        B     C     D
##    <dbl> <dbl> <dbl>
## 1 -0.542 0.891 0.596

我什至可以通过这个范围作为 quosure:

cols = quo(B:D)
select(d, !!cols)
# same result as above

但我不能将它作为符号传递:

colsym = sym("B:D")
select(d, !!enquo(colsym))
## Error in .f(.x[[i]], ...) : object 'A:C' not found

这在使用列范围选择时会出现问题,例如在 R 包中。

在我的实际示例中,我选择了 20-40 列的多个范围,因此我想坚持使用 : 运算符,而不是写出多个 20-40 元素向量并使用 @987654330 @(我认为它会起作用,但我还没有测试过)。

【问题讨论】:

    标签: r dplyr rlang


    【解决方案1】:

    您试图将非语法名称B:D 作为符号传递——您想要的是一个表达式。您可以使用rlang::parse_expr 将字符串转换为表达式:

    cols <- rlang::parse_expr("B:D")
    
    select(d, !!cols)
    ## A tibble: 1 x 3
    #       B     C     D
    #   <dbl> <dbl> <dbl>
    #1 -0.542 0.891 0.596
    

    【讨论】:

    • 太好了,谢谢。这适用于单列 (parse_expr("B")) 和范围 (parse_expr("B:D"))
    猜你喜欢
    • 2020-12-23
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2021-10-06
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多