R:从列表

时间:2017-10-27 19:48:09

标签: r list loops

抱歉可能是一个基本/多余的问题(启动标题很糟糕)。我一直在努力计算列表中数据框内的列的方法。我尝试了类似问题中提到的各种方法,但永远无法使其发挥作用。我对r比较新,而且有点超出我的深度。

我有一个类似于以下数据框的列表:

df1 <- data.frame(c("Jan", "Jan", "Jan"), c("21:14:33", "21:14:33", "21:14:33"), c(1, 2, 3), c(11, 12, 13))
df2 <- data.frame(c("Feb", "Feb", "Feb"), c("22:14:33", "22:14:33", "22:14:33"), c(2, 3, 4), c(12, 13, 14))
df3 <- data.frame(c("Mar", "Mar", "Mar"), c("23:14:33", "23:14:33", "23:14:33"), c(3, 4, 5), c(13, 14, 15))
mylist <- list(df1, df2, df3)

我的目标是为每个数据框创建一个包含月,时间,mean.column3,mean.column4的向量。例如,对于第一个数据帧,“Jan,21:14:33,2,12”。 (最终我想将所有这些向量组合成一个新的数据框,但是一旦我使用了rbind的向量,我就能做到这一点。)

我已经得到最接近使用for循环来计算平均值,但是使用下面的代码它只给出了最后一个数据帧的平均值(df3):

for(i in seq_along(mylist)){
output <- sapply(mylist[[i]][3:4], MARGIN = 2, FUN = mean)
}

我也尝试过使用lapply(如建议的here),abind(如建议的here)和map(如建议的here),这让我觉得我是问题,必须遗漏一些东西。

这些方法都没有开始解决在结果向量中包含月份和时间的需要。我尝试使用这样的代码为单个数据框做这件事,但它给了我所有的月份和时间,当我真的只需要它们一次。

output1 <- c(mylist[[1]][1,1:2],sapply(mylist[[1]][3:4], MARGIN = 2, FUN = mean))

帮助?

2 个答案:

答案 0 :(得分:3)

我认为您计算平均值然后合并为一个数据框的计划是向后的 - 您的数据框都具有相同的列,因此请继续将它们组合起来!然后做分组手段很容易。

我在这里使用data.table因为它具有良好的分组均值语法,并且rbindlist会忽略示例中不同的(可怕的)列名称:

library(data.table)
mydt = rbindlist(mylist)

# get better column names
setnames(mydt, c("month", "time", "x1", "x2"))

# means by group
mydt[, .(mx1 = mean(x1), mx2 = mean(x2)), by = .(month, time)]
#    month     time mx1 mx2
# 1:   Jan 21:14:33   2  12
# 2:   Feb 22:14:33   3  13
# 3:   Mar 23:14:33   4  14

# (if you have more columns and you don't want to type out all the means)
mydt[, lapply(.SD, mean), by = .(month, time)]

答案 1 :(得分:1)

with(do.call(rbind, lapply(mylist, function(x)
    setNames(x, paste0("X",1:NCOL(x))))),
    aggregate(list(C3 = X3, C4 = X4), list(C1 = X1, C2 = X2), mean))
#   C1       C2 C3 C4
#1 Jan 21:14:33  2 12
#2 Feb 22:14:33  3 13
#3 Mar 23:14:33  4 14