首页 文章

如何颠倒列表中data.frame对象的顺序,让它们具有相同的模式? [重复]

提问于
浏览
0

这个问题在这里已有答案:

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

通过列表中的变量,我们可以使用空气质量,虹膜,汽车,二氧化碳等公共数据在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))

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

1 回答

  • 1

    我假设嵌套是常量并创建一些帮助函数以保持可读性:

    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的嵌套列表 .

相关问题