[英]Taking Averages Across Lists
我在 R 中有這個列表(我只能訪問該列表 - 而不是 d1、d2、d3、d4 ......我只是包含這些以使這個 stackoverflow 問題可重現):
d1 = data.frame(v1 = rnorm(20,20,20), c2 = rnorm(20,20,20), id = 1:20)
d2 = data.frame(v1 = rnorm(20,20,20), c2 = rnorm(20,20,20), id = 1:20)
d3 = data.frame(v1 = rnorm(20,20,20), c2 = rnorm(20,20,20), id = 1:20)
d4 = data.frame(v1 = rnorm(20,20,20), c2 = rnorm(20,20,20), id = 1:20)
my_list = list(d1,d2, d3, d4)
我想創建一個新的數據框(20 行,2 列),其中包含每個 id 的 v1 和 c2 的平均值。 我試過這個代碼:
final_data = data.frame(mean_v1 = mean(my_list[[1]][1] + my_list[[2]][1] + my_list[[3]][1] + my_list[[4]][1]), mean_c2 = mean(my_list[[1]][2] + my_list[[2]][2] + my_list[[3]][2] + my_list[[4]][2]))
但這給了我一個警告信息和一個空的結果:
Warning messages:
1: In mean.default(my_list[[1]][1] + my_list[[2]][1] + my_list[[3]][1], :
argument is not numeric or logical: returning NA
2: In mean.default(my_list[[1]][2] + my_list[[2]][2] + my_list[[3]][2], :
argument is not numeric or logical: returning NA
> final_data
mean_v1 mean_c2
1 NA NA
my_list[]
?最后,這看起來像這樣:
mean_v1 mean_c2 id
1 37.1730736 49.3012881 1
2 -0.7861481 -9.5201620 2
3 47.2629669 -4.0249373 3
4 -25.4266542 16.6597656 4
5 18.1102329 15.0924825 5
6 -7.7148600 21.0085447 6
7 37.2753666 21.7701739 7
8 53.5393623 0.2115059 8
9 12.2578949 -11.6501821 9
10 18.3532267 44.0709866 10
11 -0.7528975 15.0990824 11
12 12.8841962 25.8737362 12
13 43.1026041 16.5399091 13
14 -1.6249458 39.6677542 14
15 23.4145601 33.0496240 15
16 -6.8168808 7.8944851 16
17 -18.8746847 16.3386228 17
18 32.8151604 14.7895162 18
19 -0.3587592 -3.2358145 19
20 11.7361017 -3.5663637 20
謝謝!
我們可以綁定list
元素,然后按mean
進行分組
library(dplyr)
bind_rows(my_list) %>%
group_by(id) %>%
summarise(across(everything(), mean, na.rm = TRUE), .groups = 'drop')
或使用aggregate
和rbind
使用base R
aggregate(.~ id, do.call(rbind, my_list), mean)
關於 OP 帖子中的問題,這只是mean
需要一個向量作為輸入,而 OP 的代碼返回一個帶有一列的data.frame
> str(my_list[[1]][1])
'data.frame': 20 obs. of 1 variable:
$ v1: num -19.1 10.7 -1.8 26.4 28.8 ...
> str(my_list[[1]][[1]])
num [1:20] -19.1 10.7 -1.8 26.4 28.8 ...
因此mean
返回NA
mean(my_list[[1]][1])
[1] NA
Warning message:
In mean.default(my_list[[1]][1]) :
argument is not numeric or logical: returning NA
相反,它應該是
mean(my_list[[1]][[1]])
[1] 18.28274
使用 R 4.2.0 中引入的新管道運算符:
my_list |>
do.call(rbind, args = _) |>
aggregate(v1 ~ id, data = _, mean)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.