【问题标题】:cannot reference grouped data in summarize(across(...))无法引用汇总中的分组数据(跨(...))
【发布时间】:2020-09-06 15:51:03
【问题描述】:

当我尝试在 summarize() 中创建多个列时,我可以在同一个汇总语句中引用新创建的列名。

例子:

目标:尝试根据标准差(“sd”)计算标准误差(“se”)。

第一步(开始为se分配sd):

data %>% 
  group_by(style) %>% 
  summarise(across(score,list(mean = mean, sd = sd, se = sd)))

返回

  style score_mean score_sd score_se
* <fct>      <dbl>    <dbl>    <dbl>
1 S1           3.5    0.707    0.707

第二步:根据sd计算se

data %>% 
  group_by(style) %>% 
  summarise(across(score,list(mean = mean, sd = sd, se = sd/sqrt(nrow(score)))))

返回

Error: Problem with `summarise()` input `..1`.
x non-numeric argument to binary operator
ℹ Input `..1` is `across(score, list(mean = mean, sd = sd, se = sd/sqrt(nrow(data))))`.
ℹ The error occured in group 1: style = "S1".

第三步调试作业项

3a) 分组数据参考

我将nrow(score)) 中的分组数据替换为其他列名甚至nrow(data),但它们都导致了相同的错误消息。

3b) 赋值操作

我用不同的变体替换了 se sd/sqrt(nrow(score))) 的赋值,导致相同的错误。最简单的是sd/2,所以即使除以常数也行不通。

3c) 赋值参考

我将 sd 替换为 score_sd 以引用创建的新列,如输出所示(步骤 1)。仍然是相同的错误消息。

问题:为什么第 1 步有效,第 2 步无效?

错误消息仅涉及整个across() 语句,因此无助于缩小根本原因。

我的直觉是我必须以某种方式引用分组数据,但我试过了 se = sd(.)/sqrt(nrow(data) 没有成功。

如果有任何提示,将不胜感激......

最小的可重现示例:

data <- structure(list(style = structure(c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 
3L, 4L, 5L), .Label = c("S1", "S2", "S3", "S4", "S5"), class = "factor"), 
    param = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L
    ), .Label = c("A", "B", "C"), class = "factor"), score = c(4, 
    1, 1, 3, 3, 3, 5, 1, 1, 1)), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

【问题讨论】:

    标签: r dplyr group-by tidyverse


    【解决方案1】:

    经过多次反复试验,我自己找到了解决方案。这适用于尚未熟悉across 功能的每个人,因为dplyr 1.0.0 尚未发布。

    所以我的问题的答案是:

    1. 您必须通过 . 运算符引用分组数据 - 但仅当您使用 purrr 公式运算符 ~ 时!

    2. 但是,您必须引用 n() 函数中的分组数据,因为 n() 不接受 . 运算符。

    第二点经过无数次试验才发现,这也是我想分享这个解决方案的原因。

    即使n() 是用括号定义的,您也可能无法直观地理解这一点,但永远不允许使用. 运算符,因为它始终引用分组数据。

    这就是这个双重技巧的样子:

    data %>% 
      group_by(style) %>% 
      summarise(across(
        score, 
        list(mean = mean, sd = sd, se = ~sd(.)/sqrt(n()))
      ))
    

    如果你知道,这很容易:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 2012-01-27
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多