如何以不同的顺序对嵌套列表中的一组 data.frame 个对象进行分组?
How to group set of data.frame objects in nested list with different order?
我在嵌套列表中有一组 data.frame 对象,我想按 data.frame 对象的名称对它们进行分组。因为每个嵌套列表,data.frame 个对象的放置顺序不同,所以我很难将它们分组到新列表中。我尝试了 CRAN 中 purr 包中的转置方法,但这不是我预期的正确答案。有谁知道更有效地为 data.frame 对象进行这种分组的技巧吗?非常感谢
示例:
res_1 <- list(con=list(a.con_1=airquality[1:4,], b.con_1=iris[2:5,], c.con_1=ChickWeight[3:7,]),
dis=list(a.dis_1=airquality[5:7,], b.dis_1=iris[8:11,], c.dis_1=ChickWeight[12:17,]))
res_2 <- list(con=list(b.con_2=iris[7:11,], a.con_2=airquality[4:9,], c.con_2=ChickWeight[2:8,]),
dis=list(b.dis_2=iris[2:5,], a.dis_2=airquality[1:3,], c.dis_2=ChickWeight[12:15,]))
res_3 <- list(con=list(c.con_3=ChickWeight[10:15,], a.con_3=airquality[2:9,], b.con_3=iris[12:19,]),
dis=list(c.dis_3=ChickWeight[2:7,], a.dis_3=airquality[13:16,], b.dis_3=iris[2:7,]))
期望的输出:
group1_New <- list(con=list(a.con_1, a.con_2, a.con_3),
dis=list(a.dis_1, a.dis_2, a.dis_3))
group2_New <- list(con=list(b.con_1, b.con_2, b.con_3),
dis=list(b.dis_1, b.dis_2, b.dis_3))
group3_New <- list(con=list(c.con_1, c.con_2, c.con_3),
dis=list(c.dis_1, c.dis_2, c.dis_3))
这是创建所需结构的两次嵌套 for 循环。可能有更有效的方法。
# put the nested lists into a list:
myList <- list(res_1, res_2, res_3)
# make a copy of the list to preserve the structure for the new list
myList2 <- myList
for(i in seq_len(length(myList))) {
# get ordering of inner list names
myOrder <- rank(names(myList[[c(i,2)]]))
for(j in seq_len(length(myList[[i]]))) {
for(k in seq_len(length(myList[[c(i, j)]]))) {
# reorder content
myList2[[c(myOrder[k], j, i)]] <- myList[[c(i, j, k)]]
# rename element
names(myList2[[c(myOrder[k], j)]])[i] <- names(myList[[c(i, j)]])[k]
}
}
}
如果需要,您可以在循环后提取列表项。
这个解决方案的关键是认识到如果将这些列表放入一个列表中,可以通过有选择地反转列表项的索引来实现结果。选择性地,我的意思是我将 rank
合并到 data.frame 名称中,以找到最内层循环的正确顺序。
除了根据需要重新排序 data.frame 之外,我还添加了一行以正确重置列表中的名称。
我在嵌套列表中有一组 data.frame 对象,我想按 data.frame 对象的名称对它们进行分组。因为每个嵌套列表,data.frame 个对象的放置顺序不同,所以我很难将它们分组到新列表中。我尝试了 CRAN 中 purr 包中的转置方法,但这不是我预期的正确答案。有谁知道更有效地为 data.frame 对象进行这种分组的技巧吗?非常感谢
示例:
res_1 <- list(con=list(a.con_1=airquality[1:4,], b.con_1=iris[2:5,], c.con_1=ChickWeight[3:7,]),
dis=list(a.dis_1=airquality[5:7,], b.dis_1=iris[8:11,], c.dis_1=ChickWeight[12:17,]))
res_2 <- list(con=list(b.con_2=iris[7:11,], a.con_2=airquality[4:9,], c.con_2=ChickWeight[2:8,]),
dis=list(b.dis_2=iris[2:5,], a.dis_2=airquality[1:3,], c.dis_2=ChickWeight[12:15,]))
res_3 <- list(con=list(c.con_3=ChickWeight[10:15,], a.con_3=airquality[2:9,], b.con_3=iris[12:19,]),
dis=list(c.dis_3=ChickWeight[2:7,], a.dis_3=airquality[13:16,], b.dis_3=iris[2:7,]))
期望的输出:
group1_New <- list(con=list(a.con_1, a.con_2, a.con_3),
dis=list(a.dis_1, a.dis_2, a.dis_3))
group2_New <- list(con=list(b.con_1, b.con_2, b.con_3),
dis=list(b.dis_1, b.dis_2, b.dis_3))
group3_New <- list(con=list(c.con_1, c.con_2, c.con_3),
dis=list(c.dis_1, c.dis_2, c.dis_3))
这是创建所需结构的两次嵌套 for 循环。可能有更有效的方法。
# put the nested lists into a list:
myList <- list(res_1, res_2, res_3)
# make a copy of the list to preserve the structure for the new list
myList2 <- myList
for(i in seq_len(length(myList))) {
# get ordering of inner list names
myOrder <- rank(names(myList[[c(i,2)]]))
for(j in seq_len(length(myList[[i]]))) {
for(k in seq_len(length(myList[[c(i, j)]]))) {
# reorder content
myList2[[c(myOrder[k], j, i)]] <- myList[[c(i, j, k)]]
# rename element
names(myList2[[c(myOrder[k], j)]])[i] <- names(myList[[c(i, j)]])[k]
}
}
}
如果需要,您可以在循环后提取列表项。
这个解决方案的关键是认识到如果将这些列表放入一个列表中,可以通过有选择地反转列表项的索引来实现结果。选择性地,我的意思是我将 rank
合并到 data.frame 名称中,以找到最内层循环的正确顺序。
除了根据需要重新排序 data.frame 之外,我还添加了一行以正确重置列表中的名称。