在r中对嵌套列表排序

在r中对嵌套列表排序,r,list,sorting,R,List,Sorting,我有几个列表,每个列表有N个对象(如下面的unsorted$b),还有一个数据框有N行(unsorted$a)。所有这些都在一个列表中(unsorted)。我希望对数据帧进行排序,同时重新排列每个嵌套列表以保持一般顺序。例如: > unsorted <- list(a=data.frame(age=c(30,10,20), name=c("ann","bob","carl")), b=list("3x10","1x10","2x10")) > unsorted $a age

我有几个列表,每个列表有N个对象(如下面的
unsorted$b
),还有一个数据框有N行(
unsorted$a
)。所有这些都在一个列表中(
unsorted
)。我希望对数据帧进行排序,同时重新排列每个嵌套列表以保持一般顺序。例如:

> unsorted <- list(a=data.frame(age=c(30,10,20), name=c("ann","bob","carl")), b=list("3x10","1x10","2x10"))
> unsorted
$a
  age name
1  30  ann
2  10  bob
3  20 carl

$b
$b[[1]]
[1] "3x10"

$b[[2]]
[1] "1x10"

$b[[3]]
[1] "2x10"
>未排序未排序
一美元
年龄名称
130安
210鲍勃
320卡尔
b美元
$b[[1]]
[1] “3x10”
$b[[2]]
[1] “1x10”
$b[[3]]
[1] “2x10”
我想按年龄分类

ord <- order(unsorted$a$age)

ord如果我正确理解了您的数据结构,那么您有一个很大的子列表,如下所示:

list_of_lists = list(unsorted, unsorted)
在你的问题中你只给出了一个例子,所以我假设

  • 你确实有一张这样的大单子
  • 嵌套有1个级别,即子列表不可能包含更多需要排序的子列表,并且
  • 所有子列表都有一个数据帧,它有一个名为“age”的列,用于确定顺序
编写执行排序的函数:

sort_list <- function(x) {
    df.index <- which(sapply(x, is.data.frame))
    stopifnot(length(df.index) == 1)
    ord <- order(x[[df.index]]$age)
    lapply(x, FUN = function(y) {
        if (is.data.frame(y)) return(y[ord, ])
        return(y[ord])
    }
    )
}
编辑: 现在您已经澄清了数据结构,我认为要做的事情是先获得订单,然后再对所有内容进行排序

# Using your code to get the order:
ord <- order(unsorted$a$age)

lapply(unsorted, function(x, ord) {
      if (is.data.frame(x)) return(x[ord,])
      return(x[ord])
    },
    ord = ord
)
#使用您的代码获取订单:

ord如果我正确地理解了您的数据结构,那么您有一个很大的子列表,如下所示:

list_of_lists = list(unsorted, unsorted)
在你的问题中你只给出了一个例子,所以我假设

  • 你确实有一张这样的大单子
  • 嵌套有1个级别,即子列表不可能包含更多需要排序的子列表,并且
  • 所有子列表都有一个数据帧,它有一个名为“age”的列,用于确定顺序
编写执行排序的函数:

sort_list <- function(x) {
    df.index <- which(sapply(x, is.data.frame))
    stopifnot(length(df.index) == 1)
    ord <- order(x[[df.index]]$age)
    lapply(x, FUN = function(y) {
        if (is.data.frame(y)) return(y[ord, ])
        return(y[ord])
    }
    )
}
编辑: 现在您已经澄清了数据结构,我认为要做的事情是先获得订单,然后再对所有内容进行排序

# Using your code to get the order:
ord <- order(unsorted$a$age)

lapply(unsorted, function(x, ord) {
      if (is.data.frame(x)) return(x[ord,])
      return(x[ord])
    },
    ord = ord
)
#使用您的代码获取订单:
ord您可以使用

lapply(unsorted, function(x) {
    if(is.vector(x)) x[order(unlist(x))] else x[order(x$age),]
})

$a
  age name
2  10  bob
3  20 carl
1  30  ann

$b
$b[[1]]
[1] "1x10"

$b[[2]]
[1] "2x10"

$b[[3]]
[1] "3x10"
你可以用

lapply(unsorted, function(x) {
    if(is.vector(x)) x[order(unlist(x))] else x[order(x$age),]
})

$a
  age name
2  10  bob
3  20 carl
1  30  ann

$b
$b[[1]]
[1] "1x10"

$b[[2]]
[1] "2x10"

$b[[3]]
[1] "3x10"

对我的答案做了更多的假设,但更清晰(+1)。谢谢。试图将其推广到所有可能的数据结构中需要很长时间。谢谢@RichardScriven。如上所述,我的大列表包括数据帧和大量的N长度列表(具有可变结构的对象)。所有子列表都需要按照与数据帧相同的标准重新排序。我的答案中有更多假设,但更清晰(+1)。谢谢。试图将其推广到所有可能的数据结构中需要很长时间。谢谢@RichardScriven。如上所述,我的大列表包括数据帧和大量的N长度列表(具有可变结构的对象)。所有子列表都需要按照与数据帧相同的标准重新排序。谢谢@Gregor。大列表具有数据帧和大量N长度列表,所有这些都需要在内部重新排序。我的例子通过只考虑其中一个子列表来简化。将@Gregor的解决方案应用于我的案例(在上一条评论中描述)会返回空的子列表。代码中有些东西需要调整哦,听起来好像每个子列表都有一个数据帧。听起来你的例子不是一个子列表,而是一个大列表的小例子。(这意味着它是一个更好的例子。)它也更容易,我今天晚些时候有时间的时候会编辑。谢谢@Gregor。大列表具有数据帧和大量N长度列表,所有这些都需要在内部重新排序。我的例子通过只考虑其中一个子列表来简化。将@Gregor的解决方案应用于我的案例(在上一条评论中描述)会返回空的子列表。代码中有些东西需要调整哦,听起来好像每个子列表都有一个数据帧。听起来你的例子不是一个子列表,而是一个大列表的小例子。(这意味着它是一个更好的例子。)它也更容易,我今天晚些时候有时间时会编辑。请参阅我的编辑。下次尝试在文本和代码中引用变量名。如果你的第一段说“我有几个列表,每个列表有N个对象(如下面的
unsorted$b
),一个数据框有N行(
unsorted$a
),那么我马上就会理解你的意思。所有这些都在一个列表中(
unsorted
)…当然,现在我很清楚了,但在第一次阅读时,我认为您的意思是每个列表都有自己的data.frame,但不必猜测您在示例中所指的“所有这些都分组在一个数据框列表和嵌套列表中”“会让我更快地明白过来。请查看我的编辑。”。下次尝试在文本和代码中引用变量名。如果你的第一段说“我有几个列表,每个列表有N个对象(如下面的
unsorted$b
),一个数据框有N行(
unsorted$a
),那么我马上就会理解你的意思。所有这些都在一个列表中(
unsorted
)…现在我当然明白了,但在第一次阅读时,我认为您的意思是每个列表都有自己的data.frame,但不必猜测您示例中的哪些列表您所说的“所有这些都分组在一个data frame和嵌套列表列表列表中”会让我更快地明白过来。