如何通过增加顺序对列表中的data.frame对象进行排序?

时间:2016-07-25 16:22:14

标签: r sorting dataframe

我在列表中设置了data.frame对象。我想通过增加订单来对它们进行排序。但是,我已经模拟了列表中5个data.frame对象的数据,我该如何对它们进行排序?有谁知道在R中这样做的任何有用技巧?提前致谢

data.frame对象集

df1 <- CO2[1:10,]
df2 <- airquality[1:10,]
df3 <- iris[1:10,]
df4 <- cars[1:10,]
df5 <-  attitude[1:10,]

d.list <- list(df1, df2, df3, df4, df5)

所需输出(手动引脚输出以供参考)

out_1 <- list(df1, df2, df3, df4, df5)  # original 
out_2 <- list(df2, df1, df3, df4, df5)
out_3 <- list(df3, df1, df2, df4, df5)
out_4 <- list(df4, df1, df2, df3, df5)
out_5 <- list(df5, df1, df2, df3, df4)

2 个答案:

答案 0 :(得分:2)

一个选项是创建vector names(或者如果OP意图&#39; d1&#39;,&#39; d2&#39;,&#39; d3&#39 ;作为&#39; df.list&#39; - names)的v1 <- names(df.list)。然后循环执行&#39; v1&#39;的序列,从&#39; v1&#39;中删除该元素。 (v1[-i]),连接&#39; v1&#39;对应于序列(v1[i])和子集&#39; df.list&#39;。

v1 <- paste0("d", 1:3)
lst <- lapply(seq_along(v1), function(i) df.list[c(v1[i], v1[-i])])
names(lst[[1]])
#[1] "d1" "d2" "d3"
names(lst[[2]])
#[1] "d2" "d1" "d3"
names(lst[[3]])
#[1] "d3" "d1" "d2"

更新

对于OP的帖子中的更新

v2 <- seq_along(d.list)
lst2 <- lapply(v2, function(i) d.list[c(i, setdiff(v2, i))])
identical(lst2[[1]], out_1)
#[1] TRUE
identical(lst2[[2]], out_2)
#[1] TRUE
identical(lst2[[3]], out_3)
#[1] TRUE

identical(lst2[[4]], out_4)
#[1] TRUE
identical(lst2[[5]], out_5)
#[1] TRUE

数据

names(df.list) <- v1

答案 1 :(得分:1)

您可以使用[重新排序(和子集)列表:

test_1 <- df.list[c(1, 2, 3)]
test_2 <- df.list[c(2, 1, 3)]
test_3 <- df.list[c(3, 1, 2)]

将返回您想要的输出。

test_1.1 <- df.list[c(1, 2)]

将返回包含前两个列表元素和

的列表
test_1.1 <- df.list[c(2, 1)]

将返回前两个列表元素,顺序颠倒。

对于较长的列表,您可以使用seq_len[执行重新排序:

test_1 <- df.list[seq_len(length(df.list))]
test_2 <- df.list[c(2, seq_len(length(df.list))[-2])]
test_3 <- df.list[c(3, seq_len(length(df.list))[-3])]

要随机排序列表,您可以使用sample

test_rand <- df.list[sample(seq_len(length(df.list)), length(df.list))]