按数据帧中的行数对数据帧列表重新排序

时间:2018-03-05 20:20:48

标签: r list dataframe

假设我在my.list中有三个数据帧,每个数据帧都有不同的行数。我想重新排序此列表,以便列表的第一个元素是行数最多的数据帧(在下面的示例中为d2)。

d1 <- data.frame(y1 = c(1, 2, 3),
                 y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1, 3, 2),
                 y2 = c(6, 5, 4, 2, 5))
d3 <- data.frame(y1 = c(2, 1),
                 y2 = c(3, 2))

my.list <- list(d1, d2, d3)

预期产出:

str(mylist[[1]]) ## 'data.frame':   5 obs. of  2 variables:
                     $ y1: num  3 2 1 3 2
                     $ y2: num  6 5 4 2 5

原因是:我在多个数据框列表中反复绘制第一个元素的数据,并希望确保在调用{{{{{{{{{{{{{{{{{{{{{{{{{{ 1}}。

plot(my.list[[1]])调用中,可能更清晰的解决方案是搜索具有最多行数的元素/数据框并绘制该图,但我不确定它会有多容易。

一个可能复杂的因素是偶尔会出现一个数据帧列表,其中有多个数据帧共享最多行数。在那种情况下,调用哪一个并不重要 - 他们都做得很好 - 但我不确定这是否会产生问题。

2 个答案:

答案 0 :(得分:3)

假设您的列表名为'lst'

lst= lst[order(sapply(lst,nrow),decreasing = T)]

答案 1 :(得分:1)

使用vapply获取每个数据框中的行数,然后使用rev(order(...))将它们从大多数行排序到最少。

nrow_each <- vapply(my.list, nrow, numeric(1))
my.list[rev(order(nrow_each))]

或者在一条难以阅读的行中进行

my.list[rev(order(vapply(my.list, nrow, numeric(1))))]