Я чувствую, что у этого должно быть действительно простое / элегантное решение, но я просто не могу его найти.(Я относительно новичок в 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
.
Я также смотрел на другие решения, подобные этому: Добавление выбранных фреймов данных вместе из списка фреймов данных
Но вложенная структура моих данных делаетя не уверен, как перевести это решение в мою проблему.
И просто хочу отметить, что данные, с которыми я работаю, являются данными GCHN Daily, поэтому структура не является моей конструкцией.Любая помощь будет принята с благодарностью.
ОБНОВЛЕНИЕ: Я частично нашел исправление, используя предложение Reduce
@Parfait, но теперь мне нужно его автоматизировать.Я работаю над решением, использующим цикл 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
loop, но пытаюсь сохранить 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
или для лучшего метода?