【问题标题】:What is the alternative to deprecated SE dplyr verbs in a for loop?在 for 循环中弃用 SE dplyr 动词的替代方法是什么?
【发布时间】:2020-01-31 02:54:02
【问题描述】:

我习惯于在 for 循环中使用 dplyr 动词的 SE 版本,并希望过渡到新的评估语义,但我正在苦苦挣扎。

在较旧的 dplyr 版本中,我会执行以下操作:

df <- tribble(
  ~x, ~y, ~z,
  "a", 2, "dog",
  "b", 1, "cat",
  "a", 2,  "cat"
)

for (i in names(df %>% select(x,z))){
  print(count_(df,i))
}

# A tibble: 2 x 2
  x         n
  <chr> <int>
1 a         2
2 b         1
# A tibble: 2 x 2
  z         n
  <chr> <int>
1 cat       2
2 dog       1

我尝试了quo/enquo/!!/!!! 的各种组合,但似乎无法使用count() 使其工作。

【问题讨论】:

  • 也许for (i in distinct(df %&gt;% select(x, z))) { print(count(df, !!i)) }
  • 您的意思是count() 还是count_()?你使用后者,但说你不能让前者工作。

标签: r dplyr tidyverse tidyeval


【解决方案1】:

rlang 提供了一个数据代词.data。当引用带有字符串的列名时,这个代词特别有用,比如你在这里。

您可以阅读有关它的更多信息/查看示例at the rlang websiterlang 0.4.0 release article 的末尾。

for (i in names(df %>% select(x,z))){
     print( count(df, .data[[i]]) )
}

【讨论】:

  • .data 从 rlang 的第一个版本开始就可用;)
【解决方案2】:

使用sym将字符串转换为符号,然后使用!!将符号插入到表达式中

for (i in names(df %>% select(x,z))){
  print(count(df, !!sym(i)))
}

【讨论】:

  • 谢谢弗利克先生。这正是我所需要的。
【解决方案3】:

有一个很棒的包,叫做wrapr,它有一个函数let,“允许使用替换的变量名执行任意代码”。该代码比使用!! 更冗长,但我发现它更容易理解且不易出错。

df <- tibble::tribble(
  ~x, ~y, ~z,
  "a", 2, "dog",
  "b", 1, "cat",
  "a", 2,  "cat"
)

for (name in names(df)) {
  wrapr::let(
    alias = list(var = name),
    expr = {
        df %>%
          count(var) %>%
          print()
    }
  )
}
#> # A tibble: 2 x 2
#>   x         n
#>   <chr> <int>
#> 1 a         2
#> 2 b         1
#> # A tibble: 2 x 2
#>       y     n
#>   <dbl> <int>
#> 1     1     1
#> 2     2     2
#> # A tibble: 2 x 2
#>   z         n
#>   <chr> <int>
#> 1 cat       2
#> 2 dog       1

【讨论】:

    【解决方案4】:
    for(nm in c("x", "z")){
        print(df %>% count(!!as.symbol(nm)))
    }
    ## A tibble: 2 x 2
    #  x         n
    #  <chr> <int>
    #1 a         2
    #2 b         1
    ## A tibble: 2 x 2
    #  z         n
    #  <chr> <int>
    #1 cat       2
    #2 dog       1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      相关资源
      最近更新 更多