R 无法引用摘要中的分组数据(跨(…)

R 无法引用摘要中的分组数据(跨(…),r,dplyr,group-by,tidyverse,R,Dplyr,Group By,Tidyverse,当我尝试在summary()中创建多个列时,我可以在同一个summary语句中引用新创建的列名 例如: 目标:尝试根据标准偏差(“sd”)计算标准误差(“se”) 步骤1(开始为se分配sd): 返回 style score_mean score_sd score_se * <fct> <dbl> <dbl> <dbl> 1 S1 3.5 0.707 0.707 Error: Proble

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

例如:

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

步骤1(开始为se分配sd): 返回

  style score_mean score_sd score_se
* <fct>      <dbl>    <dbl>    <dbl>
1 S1           3.5    0.707    0.707
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".
返回

  style score_mean score_sd score_se
* <fct>      <dbl>    <dbl>    <dbl>
1 S1           3.5    0.707    0.707
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".
步骤3调试任务期限 3a)分组数据参考 我将
nrow(score))
中的分组数据替换为其他列名,甚至
nrow(data)
,但它们都会导致相同的错误消息

3b)分配操作 我将se
sd/sqrt(nrow(score))
的赋值替换为不同的变量,导致了相同的错误。最简单的是sd/2,所以即使除以常数也不起作用

3c)分配参考 我将
sd
替换为
score\u sd
,以引用创建的新列,如输出中所示(步骤1)。仍然显示相同的错误消息

问题:为什么第一步有效而第二步无效? 错误消息只引用整个
cross()
语句,因此无助于缩小根本原因

我的直觉是我必须以某种方式引用分组数据,但我尝试了
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"))

data经过多次尝试和出错后,我自己找到了解决方案。这是为每个还不熟悉跨
函数的
的人准备的,因为
dplyr 1.0.0
尚未发布

因此,我的问题的答案是:

  • 必须通过
    运算符引用分组数据-但仅当使用
    purrr
    公式运算符
    ~

  • 但是,不能在
    n()
    函数中引用分组数据,因为
    n()
    不接受
    运算符

  • 第二点需要无数次的尝试才能找到,这就是我想分享这个解决方案的原因

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

    这就是这个双重把戏的样子:

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

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

    经过多次尝试,我自己找到了解决方案。这适用于尚未熟悉跨
    功能的所有人,因为
    dplyr 1.0.0
    尚未发布

    因此,我的问题的答案是:

  • 必须通过
    运算符引用分组数据-但仅当使用
    purrr
    公式运算符
    ~

  • 但是,不能在
    n()
    函数中引用分组数据,因为
    n()
    不接受
    运算符

  • 第二点需要无数次的尝试才能找到,这就是我想分享这个解决方案的原因

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

    这就是这个双重把戏的样子:

    data %>% 
      group_by(style) %>% 
      summarise(across(
        score, 
        list(mean = mean, sd = sd, se = ~sd(.)/sqrt(n()))
      ))
    
    如果你知道的话,这很容易:-)