我的问题需要我对多列数据进行总结,但每列数据必须使用另外三列的多变量函数进行总结。
我的数据帧中有数百列包含关于数据集的不同统计信息。这里是一个结构类似、规模较小的数据帧。
df <- data.frame(a1_Avg = rnorm(10),
a1_Std = runif(10),
a2_Avg = rnorm(10),
a2_Std = runif(10),
Hour = c(1.0, 1.5, 2.0, 2.25, 2.5, 2.75, 3.0, 4.0, 4.5, 5.0),
Measurements = c(3, 3, 6, 6, 6, 6, 10, 7, 7, 2)) %>%
数据需要压缩成行,汇总每小时的数据块。对于平均值的汇总很容易:可以简单地对它们进行平均,因为每小时的测量次数是一致的。
group_by(Hour) %>%
summarize(across(matches("a._Avg"), ~ mean(.x), .names = "combined_{col}"),
但是合并标准差更加棘手,因为我需要从三个不同的列中获取信息来计算它。如果手动操作,我会这样做:
combined_a1_Std = sqrt((1/n())*sum(a1_Std^2 + (a1_Avg - combined_a1_Avg)^2)),
combined_a2_Std = sqrt((1/n())*sum(a2_Std^2 + (a2_Avg - combined_a2_Avg)^2)))
但是对于数百列来说这是不可行的。
有没有简单的方法可以做到这一点?
以下是完整的代码和期望输出:
set.seed(1)
df <- data.frame(a1_Avg = rnorm(10),
a1_Std = runif(10),
a2_Avg = rnorm(10),
a2_Std = runif(10),
Hour = c(1.0, 1.5, 2.0, 2.25, 2.5, 2.75, 3.0, 4.0, 4.5, 5.0),
Measurements = c(3, 3, 6, 6, 6, 6, 10, 7, 7, 2)) %>%
mutate(Hour = floor(Hour)) %>%
group_by(Hour) %>%
summarize(across(matches("a._Avg"), ~ mean(.x), .names = "combined_{col}"),
combined_a1_Std = sqrt((1/n())*sum(a1_Std^2 + (a1_Avg - combined_a1_Avg)^2)),
combined_a2_Std = sqrt((1/n())*sum(a2_Std^2 + (a2_Avg - combined_a2_Avg)^2)))
df
Hour combined_a1_Avg combined_a2_Avg combined_a1_Std combined_a2_Std
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 -0.221 -0.0306 0.859 0.859
2 2 0.0672 0.819 1.17 1.17
3 3 0.487 0.782 0.116 0.116
4 4 0.657 -0.957 0.795 0.795
5 5 -0.305 0.620 0.583 0.583
.
可以匹配任何字符,并且只有一个数字。 - akrun