在r中对嵌套列表排序
我有几个列表,每个列表有N个对象(如下面的在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
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和嵌套列表列表列表中”会让我更快地明白过来。