在条件上排序数据框列表

时间:2017-05-22 06:21:12

标签: r

我有一个包含不同列数的数据框列表。

说Y是包含4,10和5列的3个数据帧的列表

我想根据首先排序哪个列的条件对列表中的这些数据帧进行排序,依此类推。因为我有另一个清单:

i1 = list(c(0),c(4,5,2,3),c(3))
i2 = c(0,4,1)

在第一个数据框中我不想对任何内容进行排序,对于第二和第三个数据框我想按照i1和i2中给出的顺序

我尝试编写此功能,该功能适用​​于1个数据框但不适用于列表

for (i in 1:length(i1){
if (i2[i] < 1) {
  sorted[[i]]=y[[i]]
} else {
  for(j in i1[[i]]){
    sorted[[i]] <- y[[i]][order(y[[i]][j],]
  }}}

1 个答案:

答案 0 :(得分:1)

我们可以使用Map

执行此操作
Map(function(x,y, z) if(z < 1) x else x[do.call(order, x[y]),], Y, i1, i2)
#[[1]]
#  V1 V2 V3 V4
#1  3 10  7 10
#2  3  3  4  2
#3  8  8  7  1
#4  6  9  7  6
#5  7  3  4  2

#[[2]]
#  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
#1  1  7  4  3  5  1  5 10  5   4
#3  8  6  4  7  3  4  5  3  3  10
#4  2  7  2  7  3  3  8  2  2   8
#2  6  1  3  8  4  4  9  5  3  10
#5  3  1 10 10  1  4  6  2  8   5

#[[3]]
#  V1 V2 V3 V4 V5
#2  3  6  2  3  8
#4 10  1  3  4  2
#5  7  8  4  9  5
#1  2  4  6  4  4
#3  1  9  6  9 10

数据

set.seed(24)
Y <- list(as.data.frame(matrix(sample(1:10, 4*5, replace=TRUE), 5, 4)),
 as.data.frame(matrix(sample(1:10, 10*5, replace=TRUE), 5, 10)),
 as.data.frame(matrix(sample(1:10, 5*5, replace=TRUE), 5, 5)))