【发布时间】: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