我的問題要求我跨多列匯總資料,但每列必須由其他三列的多變數函式匯總。
我有一個包含數百列的資料框,其中包含有關資料集的不同統計資訊。這是一個類似結構的較小資料框。
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
uj5u.com熱心網友回復:
一種選擇是回圈遍歷一組列,然后get通過替換列名稱中的子字串來回圈另一組
library(dplyr)
library(stringr)
out2 <- df %>%
mutate(Hour = floor(Hour)) %>%
group_by(Hour) %>%
summarize(across(matches("a\\d _Avg"), ~ mean(.x),
.names = "combined_{col}"),
across(matches('^a\\d _Avg$'),
~ sqrt((1/n())*sum(get(str_replace(cur_column(), "Avg", "Std"))
(. - get(str_c( "combined_", cur_column() )))^2)),
.names = "combined_{str_replace(.col, 'Avg', 'Std')}"))
- 檢查 OP 的手動方法
out1 <- df %>%
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 (a1_Avg - combined_a1_Avg)^2)),
combined_a2_Std = sqrt((1/n())*sum(a2_Std (a2_Avg - combined_a2_Avg)^2)))
identical(out1, out2)
[1] TRUE
資料
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))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/393432.html
下一篇:將格式正確的字串轉換為資料框
