如何反转列表中 data.frame 对象的顺序,让它们具有相同的模式?

How to reverse the order of data.frame object in the list that let them have same pattern?

我有三个列表,其中包含 data.frame 个对象,但顺序肯定非常不同。我想让它们具有相同的顺序,例如 list1、list2 或 list 3。如何反转不同列表中具有相同 pattern/order 的 data.frame 对象的顺序?有没有人给我一些可能的想法来轻松地进行这种操作?非常感谢。

有了列表中的变量,我们可以使用 public 空气质量、虹膜、汽车、二氧化碳等数据在 R 中快速 运行;

数据

list1 <- list(pass=list(Alpha.df1_yes, Beta.df1_yes, Gamma.df1_yes, Theta.df1_yes),
              fail=list(Alpha.df1_no, Beta.df1_no, Gamma.df1_no, Theta.df1_no))

list2 <- list(pass=list(Beta.df2_yes, Alpha.df2_yes, Gamma.df2_yes, Theta.df2_yes),
              fail=list(Beta.df2_no, Alpha.df2_no, Gamma.df2_no, Theta.df2_no))

list3 <- list(pass=list(Gamma.df3_yes, Alpha.df3_yes, Beta.df3_yes, Theta.df3_yes),
              fail=list(Gamma.df3_no, Alpha.df3_no, Beta.df3_no, Theta.df3_no))

list4 <- list(pass=list( Theta.df4_yes, Alpha.df4_yes, Beta.df4_yes,Gamma.df4_yes),
              fail=list(Theta.df4_no, Alpha.df4_no, Beta.df4_no,Gamma.df4_no ))

期望的输出(让我们使用与 list1 相同的模式):

list1 <- list(pass=list(Alpha.df1_yes, Beta.df1_yes, Gamma.df1_yes, Theta.df1_yes),
              fail=list(Alpha.df1_no, Beta.df1_no, Gamma.df1_no, Theta.df1_no))

list2_NeW <- list(pass=list(Alpha.df2_yes, Beta.df2_yes, Gamma.df2_yes, Theta.df2_yes),
                  fail=list(Alpha.df2_no, Beta.df2_no, Gamma.df2_no, Theta.df2_no))

list3_New <- list(pass=list(Alpha.df3_yes, Beta.df3_yes,Gamma.df3_yes, Theta.df3_yes),
              fail=list(Alpha.df3_no, Beta.df3_no, Gamma.df3_no, Theta.df3_no))

list4_New <- list(pass=list(Alpha.df4_yes, Beta.df4_yes,Gamma.df4_yes, Theta.df4_yes),
              fail=list(Alpha.df4_no, Beta.df4_no, Gamma.df4_no, Theta.df4_no))

因为数据在嵌套结构中,让它们在新构造的列表中具有相同的模式有点棘手。谁能提出可能的想法?

我假设嵌套是不变的,并创建了一些帮助函数以保持可读性:

exchangeDF <- function(List, newOrder){
    return(List[newOrder])
}
newOrder <- c(2,1,3,4)
list2_NeW <- list(pass = exchangeDF(list2$pass, newOrder),
                  fail = exchangeDF(list2$fail, newOrder))
#....

为了使其更通用:

newOrder <- c(2,1,3,4)
exchangeNestedDF <- function(ListOfListsOfDF, newOrder){
  NewList <- lapply(ListOfListsOfDF, function(x) x[newOrder])
  names(NewList) <- names(ListOfListsOfDF)
  return(NewList)
}
list2_NeW <- exchangeNestedDF(list2, newOrder)

如果你愿意,你可以将它应用到所有列表项(尤其是当你有更多列表项时):

NewOrders <- list(c(2,1,3,4),  c(2,3,1,4),  c(2,3,4,1))
LIST <- lapply(1:3, function(i) exchangeNestedDF(get(paste0("list", i)), NewOrders[[i]]))

请注意,此解决方案非常适用于 data.frames 的嵌套列表。