簡體   English   中英

跨列表取平均值

[英]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')

或使用aggregaterbind使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM