首页 > 解决方案 > 在 R 中的列表元素之间进行聚合

问题描述

我有一个包含 35 个元素 ( PercChangeDiff) 的列表,每个元素包含 3 个变量 ( WEEKINTpercentEXTpercent),所有这些变量都包含 34 个值。WEEK我的目标是找到元素的每个日期(从)的单个平均值,以便我最终得到整个列表的每个日期的单个INTpercent和值(我想聚合所有元素)。 EXTpercentINTpercentEXTpercent

我尝试了下面的代码:

PercChangeAvg <- lapply(PercChangeDiff, function(x) {
  aggregate(list(INTpercAvg = x[["INTpercent"]], EXTpercAvg = x[["EXTpercent"]]), by = as.list(x[["WEEK"]]), FUN = "mean", simplify = TRUE)
}
)

但我收到以下错误:

aggregate.data.frame(as.data.frame(x), ...) 中的错误:参数必须具有相同的长度

我检查了xby参数的长度,它们都是 34。任何关于如何解决这个问题的想法都将不胜感激。

我的数据负责人如下:

> head(PercChangeDiff)
$`20014409-EA`
$`20014409-EA`$`WEEK`
 [1] "2017-10-02" "2017-10-09" "2017-10-16" "2017-10-23" "2017-10-30" "2017-11-06" "2017-11-13" "2017-11-20"
 [9] "2017-11-27" "2017-12-04" "2017-12-11" "2017-12-18" "2018-01-15" "2018-01-22" "2018-01-29" "2018-02-05"
[17] "2018-02-12" "2018-02-19" "2018-02-26" "2018-03-05" "2018-03-12" "2018-03-19" "2018-03-26" "2018-04-02"
[25] "2018-04-09" "2018-04-16" "2018-04-23" "2018-04-30" "2018-05-07" "2018-05-14" "2018-05-21" "2018-05-28"
[33] "2018-06-04" "2018-06-11"

$`20014409-EA`$INTpercent
 [1]        NA   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000 -42.80936
[11]   0.00000   0.00000  29.97658   0.00000   0.00000 -42.80936   0.00000   0.00000   0.00000  29.97658
[21]   2.28833   0.00000   0.00000   0.00000  -2.34192   0.00000   0.00000   0.00000   0.00000   0.00000
[31]   0.00000   0.00000   0.00000   0.00000

$`20014409-EA`$EXTpercent
 [1]         NA  0.0000000 -0.5102041  0.5076142  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000
[10]  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000
[19]  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000
[28]  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000


$`20015041-EA`
$`20015041-EA`$`WEEK`
 [1] "2017-10-02" "2017-10-09" "2017-10-16" "2017-10-23" "2017-10-30" "2017-11-06" "2017-11-13" "2017-11-20"
 [9] "2017-11-27" "2017-12-04" "2017-12-11" "2017-12-18" "2018-01-15" "2018-01-22" "2018-01-29" "2018-02-05"
[17] "2018-02-12" "2018-02-19" "2018-02-26" "2018-03-05" "2018-03-12" "2018-03-19" "2018-03-26" "2018-04-02"
[25] "2018-04-09" "2018-04-16" "2018-04-23" "2018-04-30" "2018-05-07" "2018-05-14" "2018-05-21" "2018-05-28"
[33] "2018-06-04" "2018-06-11"

$`20015041-EA`$INTpercent
 [1]          NA  30.4609218   0.0000000   0.0000000  -0.4024145   0.0000000   0.0000000   0.0000000
 [9]   0.0000000   0.0000000   0.0000000   0.0000000 -24.2500000   0.0000000   0.0000000   0.0000000
[17]   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000  19.5171026
[25]   0.0000000   0.0000000   0.0000000   0.0000000 -24.2500000   0.0000000   0.0000000   0.0000000
[33]  19.5171026   0.0000000

$`20015041-EA`$EXTpercent
 [1]          NA   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000  -0.4048583   0.4032258
 [9]   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
[17]   0.0000000   0.0000000   0.0000000 -42.9394813   0.0000000   0.0000000  30.0403226   0.0000000
[25]   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
[33]   0.0000000   0.0000000


$`20016844-EA`
$`20016844-EA`$`WEEK`
 [1] "2017-10-02" "2017-10-09" "2017-10-16" "2017-10-23" "2017-10-30" "2017-11-06" "2017-11-13" "2017-11-20"
 [9] "2017-11-27" "2017-12-04" "2017-12-11" "2017-12-18" "2018-01-15" "2018-01-22" "2018-01-29" "2018-02-05"
[17] "2018-02-12" "2018-02-19" "2018-02-26" "2018-03-05" "2018-03-12" "2018-03-19" "2018-03-26" "2018-04-02"
[25] "2018-04-09" "2018-04-16" "2018-04-23" "2018-04-30" "2018-05-07" "2018-05-14" "2018-05-21" "2018-05-28"
[33] "2018-06-04" "2018-06-11"

$`20016844-EA`$INTpercent
 [1]       NA 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
[12] 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 4.784689 0.000000
[23] 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
[34] 0.000000

$`20016844-EA`$EXTpercent
 [1]          NA   0.0000000 -19.9195171  16.3299663   0.0000000   0.0000000   0.0000000   0.0000000
 [9]   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
[17]   0.0000000  -0.5076142   0.5050505   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
[25]   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
[33]   0.0000000   0.0000000

数据

l <- list(`20014409-EA` = list(WEEK = structure(c(NA, 17448, 17455, 17462, 17469, 17476, 17483, 17490, 17497, 17504, 17511, 17518, 17546, 17553, 17560, 17567, 17574, 17581, 17588, 17595, 17602, 17609, 17616, 17623, 17630, 17637, 17644, 17651, 17658, 17665, 17672, 17679, 17686, 17693), class = "Date"), INTpercent = c(NA, 0, 0, 0, 0, 0, 0, 0, 0, -42.809364548495, 0, 0, 29.9765807962529, 0, 0, -42.809364548495, 0, 0, 0, 29.9765807962529, 2.28832951945081, 0, 0, 0, 2.34192037470727, 0, 0, 0, 0, 0, 0, 0, 0, 0), EXTpercent = c(NA, 0, -0.510204081632654, 0.50761421319797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), `20015041-EA` = list(WEEK = structure(c(NA, 17448, 17455, 17462, 17469, 17476, 17483, 17490, 17497, 17504, 17511, 17518, 17546, 17553, 17560, 17567, 17574, 17581, 17588, 17595, 17602, 17609, 17616, 17623, 17630, 17637, 17644, 17651, 17658, 17665, 17672, 17679, 17686, 17693), class = "Date"), INTpercent = c(NA, 30.4609218436874, 0, 0, -0.402414486921538, 0, 0, 0, 0, 0, 0, 0, -24.25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19.5171026156942, 0, 0, 0, 0, -24.25, 0, 0, 0, 19.5171026156942, 0), EXTpercent = c(NA, 0, 0, 0, 0, 0, -0.404858299595133, 0.403225806451604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42.9394812680115, 0, 0, 30.0403225806452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), `20016844-EA` = list(WEEK = structure(c(NA, 17448, 17455, 17462, 17469, 17476, 17483, 17490, 17497, 17504, 17511, 17518, 17546, 17553, 17560, 17567, 17574, 17581, 17588, 17595, 17602, 17609, 17616, 17623, 17630, 17637, 17644, 17651, 17658, 17665, 17672, 17679, 17686, 17693), class = "Date"), INTpercent = c(NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4.78468899521531, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), EXTpercent = c(NA, 0, -19.9195171026157, 16.3299663299663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0.507614213197974, 0.505050505050509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), `20044140-EA` = list(WEEK = structure(c(NA, 17448, 17455, 17462, 17469, 17476, 17483, 17490, 17497, 17504, 17511, 17518, 17546, 17553, 17560, 17567, 17574, 17581, 17588, 
17595, 17602, 17609, 17616, 17623, 17630, 17637, 17644, 17651, 17658, 17665, 17672, 17679, 17686, 17693), class = "Date"), INTpercent = c(NA, 0, 0, 0, 0, 0, 0, 0, 0, -59.5317725752508, 0, 0, -59.0425531914894, 0, 60.5870020964361, 0, 0, 0, 0, 0, 2.05338809034909, 0, -151.030927835052, 60.1642710472279, 0, 0, 0, 0, -143.5, 0, 58.9322381930185, -63.973063973064, 0, 0), EXTpercent = c(NA, 0, -17.632241813602, 14.9892933618844, 0, 0, -137.055837563452, 0, 57.8158458244111, -137.055837563452, 57.8158458244111, 0, 0, 0, 0, 0, 0, -91.3934426229508, 0, 47.7516059957173, 0, 0, -89.0688259109312, 0, 47.1092077087794, 0, 0, 0, 0, -153.804347826087, 60.5995717344754, 0, 0, 0)), `20067427-EA` = list(WEEK = structure(c(NA, 17448, 17455, 17462, 17469, 17476, 17483, 17490, 17497, 17504, 17511, 17518, 17546, 17553, 17560, 17567, 17574, 17581, 17588, 17595, 17602, 17609, 17616, 17623, 17630, 17637, 17644, 17651, 17658, 17665, 17672, 17679, 17686, 17693), class = "Date"), INTpercent = c(NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34.3544857768053, 0, 0, 0, 2.14132762312633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -23.8726790450928, 19.271948608137, -57.2390572390572), EXTpercent = c(NA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -87.7049180327869, 17.8451178451179, 0, -21.7213114754098, 0, 46.4912280701754, 0, 0, 0, -58.3333333333333, 0, 0, 0, 0, 0, 0, 4)), `20071339-EA` = list(WEEK = structure(c(NA, 17448, 17455, 17462, 17469, 17476, 17483, 17490, 17497, 17504, 17511, 17518, 17546, 17553, 17560, 17567, 17574, 17581, 17588, 17595, 17602, 17609, 17616, 17623, 17630, 17637, 17644, 17651, 17658, 17665, 17672, 17679, 17686, 17693), class = "Date"), INTpercent = c(NA, 0, 25.5639097744361, 0, 0, 0, 0, -61.5384615384615, 0, 0, 0, 0, 0, 38.0952380952381, -34.3434343434343, 0, -3.48432055749129, 0, 28.0701754385965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -99.5, 49.874686716792, -34.3434343434343, 25.5639097744361, 0), EXTpercent = c(NA, 10.1010101010101, 0, 25.3768844221105, 0, -40.1408450704225, 0, 0, 0, 0, 28.643216080402,  0, -61.1336032388664, 14.2361111111111, -16.5991902834008,   14.2361111111111, 0, 0, 27.6381909547739, -34.006734006734, -11.2359550561798, 32.9145728643216, 0, -38.1944444444444, 0, 27.6381909547739, 0, 0, 0, 0, 0, -38.1944444444444, 0, 0)))

标签: raggregatemean

解决方案


使用tidyverse

library(tidyverse)
map(l,as_tibble) %>%
  bind_rows %>%
  group_by(WEEK) %>%
  summarize_all(mean)

# # A tibble: 34 x 3
#         WEEK   INTpercent  EXTpercent
#       <date>        <dbl>       <dbl>
# 1 2017-10-09   5.07682031   1.6835017
# 2 2017-10-16   4.26065163  -6.3436605
# 3 2017-10-23   0.00000000   9.5339597
# 4 2017-10-30  -0.06706908   0.0000000
# 5 2017-11-06   0.00000000  -6.6901408
# 6 2017-11-13   0.00000000 -22.9101160
# 7 2017-11-20 -10.25641026   0.0672043
# 8 2017-11-27   0.00000000   9.6359743
# 9 2017-12-04 -17.05685619 -22.8426396
# 10 2017-12-11   0.00000000  14.4098437
# # ... with 24 more rows

以 R 为基础的翻译:

aggregate(cbind(INTpercent, EXTpercent) ~ WEEK,
          do.call(rbind, lapply(l,as.data.frame)),
          mean)

推荐阅读