R:从列表中的数据帧创建特定单元格的向量和某些列的平均值

R:从列表中的数据帧创建特定单元格的向量和某些列的平均值,r,list,loops,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"

很抱歉,这可能是一个基本/多余的问题(标题很糟糕)。我一直在努力计算列表中数据帧中列的方式。我尝试过类似问题中提到的各种方法,但始终无法使其发挥作用。我对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)

df1我认为你计算平均值然后合并成一个数据帧的计划是倒退的——你的数据帧都有相同的列,所以现在就开始合并吧!那么做分组方式是很容易的

我将在这里使用
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)]

你真的应该给你的专栏命名。它使数据更易于处理和读取。一个向量只能有一个类,因此不能有一个包含2个字符串/因子(月份和时间)和2个数字(你的平均值)的向量。如果你需要输出为字符串,值用逗号分隔,你可以做
应用(mydt[,lapply(.SD,mean),by=(月份,时间)],1,toString)
这是解决这个问题的更好方法。感谢您的帮助@Gregor,以及您对这些步骤的解释。非常感谢@RobJensen你在这里的评论(以及你之前的回答)也很有帮助,因为它绕过了我真实数据中的一些奇怪之处。谢谢谢谢@d.b!只是澄清一下,
聚合
行是否取所有四列的平均值?
output1 <- c(mylist[[1]][1,1:2],sapply(mylist[[1]][3:4], MARGIN = 2, FUN = mean))
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)]
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