抱歉可能是一个基本/多余的问题(启动标题很糟糕)。我一直在努力计算列表中数据框内的列的方法。我尝试了类似问题中提到的各种方法,但永远无法使其发挥作用。我对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))
帮助?
答案 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