【发布时间】:2018-09-25 23:21:14
【问题描述】:
我觉得这应该有一个非常简单/优雅的解决方案,但我就是找不到。 (我对 r 比较陌生,所以这并不奇怪。)
我有一个(大)嵌套列表,其中包含我要添加在一起的 data.frames。这是创建一些示例数据的代码:
#Create data frames nested in a list
for (i in 1:6) {
for (j in 1:4) {
assign(paste0("v", j), sample.int(100,4))
}
assign(paste0("df", i), list(cbind(v1, v2, v3, v4)))
}
inner1 <- list(data1 = df1, data2 = df2)
inner2 <- list(data1 = df3, data2 = df4)
inner3 <- list(data1 = df5, data2 = df6)
outer <- list(group1 = inner1, group2 = inner2, group3 = inner3)
我需要将所有标记为data1 的数据框和所有data2 的数据框加在一起。如果它们不是这种嵌套列表格式,我会这样做:
data1.tot <- df1 + df3 + df5
data2.tot <- df2 + df4 + df6
因为它们在一个列表中,我认为可能有lapply 的解决方案并尝试了:
grp <- c("group1", "group2", "group3") #vector of groups to sum across
datas <- lapply(outer, "[[", "data1") #select "data1" from all groups
tot.datas <- lapply(datas[grp], "+") #to sum across selected data
#I know these last two steps can be combined into one but it helps me keep everything straight to separate them
但它返回Error in FUN(left): invalid argument to unary operator,因为我将数据列表作为x 传递。
我也看过类似的其他解决方案:Adding selected data frames together, from a list of data frames
但是我的数据的嵌套结构让我不确定如何将该解决方案转化为我的问题。
请注意,我使用的数据是 GCHN 每日数据,因此结构不是我的设计。任何帮助将不胜感激。
更新:
我已经使用@Parfait 的Reduce 的建议部分想出了一个修复方法,但现在我需要自动化它。我正在使用for 循环开发解决方案,因为这让我可以更好地控制我正在访问的元素,但我对其他想法持开放态度。这是有效的手动解决方案:
get.df <- function(x, y, z) {
# function to pull out the desired data.frame from the list
# x included as argument to make function applicable to my real data
output <- x[[y]][[z]]
output[[1]]
}
output1 <- get.df(x = outer, y = "group1", z = "data1")
output2 <- get.df(x = outer, y = "group2", z = "data1")
data1 <- list(output1, output2)
data1.tot <- Reduce(`+`, data1)
使用我的示例数据,我想在 2 种数据类型(“data1”和“data2”)和 3 个组(“group1”、“group2”、“group3”)上循环。我正在研究for 循环解决方案,但正在努力解决如何将output1 和output2 保存在列表中。我的循环现在看起来像这样:
dat <- c("data1", "data2")
grp <- c("group1", "group2", "group3")
for(i in 1:length(dat)) {
for(j in 1:length(grp)) {
assign(paste0("out", j), get.df(x = outer, y = grp[j], z = dat[i]))
}
list(??? #clearly this is where I'm stuck!
}
关于for 循环问题或更好的方法有什么建议吗?
【问题讨论】:
-
data1.tot <- df1[[1]] + df3[[1]] + df5[[1]]怎么样。这就是你要找的吗? -
谢谢。但是总共有 158 x 14 df,所以我正在寻找一种不需要全部输入的解决方案。
-
我使用@Parfait 对
Reduce的建议取得了一些进展,但仍然遇到一些问题。我在上面发布了更新。 -
对我来说,最终的输出应该是什么样子还不清楚。是清单吗?是单数吗?请提供硬编码输出,以便我们了解您的目标。