在R中排序/重新排列数据列表

时间:2018-02-22 07:11:43

标签: r sorting

我有一个清单(l):

[1] 0 0 0 1 1 1 2 2 2

[2] 0 0 0 1 1 1 2 2 2

[3] 0 0 0 1 1 1 2 2 2 

现在我想首先对它进行排序:

[1] 0 1 2 0 1 2 0 1 2 

[2] 0 1 2 0 1 2 0 1 2 

[3] 0 1 2 0 1 2 0 1 2 

然后:

[1] 0 1 2

[2] 0 1 2

[3] 0 1 2

[4] 0 1 2

[5] 0 1 2

[6] 0 1 2

[7] 0 1 2

[8] 0 1 2

[9] 0 1 2

我该怎么做?我不知道:/请帮帮我

2 个答案:

答案 0 :(得分:1)

我们使用list遍历vectorlapply,创建一个aveorder vector

l1 <- lapply(l, function(x) x[order(ave(x, x, FUN = seq_along))])
l1
#[[1]]
#[1] 0 1 2 0 1 2 0 1 2

#[[2]]
#[1] 0 1 2 0 1 2 0 1 2

#[[3]]
#[1] 0 1 2 0 1 2 0 1 2

然后,我们找到0将矢量分割成子矢量的位置

unname(do.call(c, lapply(l1, function(x) split(x, cumsum(!x)))))
#[[1]]
#[1] 0 1 2

#[[2]]
#[1] 0 1 2

#[[3]]
#[1] 0 1 2

#[[4]]
#[1] 0 1 2

#[[5]]
#[1] 0 1 2

#[[6]]
#[1] 0 1 2

#[[7]]
#[1] 0 1 2

#[[8]]
#[1] 0 1 2

#[[9]]
#[1] 0 1 2

此外,如果最终结果是目标,则可以一步完成

unname(split(c(aperm(array(unlist(l), c(3, 3, 3)), c(2, 1, 3))), as.numeric(gl(27, 3, 27))))
#[[1]]
#[1] 0 1 2

#[[2]]
#[1] 0 1 2

#[[3]]
#[1] 0 1 2

#[[4]]
#[1] 0 1 2

#[[5]]
#[1] 0 1 2

#[[6]]
#[1] 0 1 2

#[[7]]
#[1] 0 1 2

#[[8]]
#[1] 0 1 2

#[[9]]
#[1] 0 1 2

数据

l <- replicate(3, rep(0:2, each = 3), simplify = FALSE)

答案 1 :(得分:0)

您可以使用lapplyunique多次重复每个唯一元素。在这里,我只是在两个元素上显示它,列表的长度无关紧要:

my_list <- list(c(0, 0, 0, 1, 1, 1, 2, 2, 2), c(0, 0, 0, 1, 1, 1, 2, 2, 2))

第一个排序列表:

## Replicate each unique element in a list
new.list.1 <- function(list) {
    unique_elements <- unique(list)
    rep(unique_elements, length(list)/length(unique_elements))
}

## Apply the function
lapply(my_list, new.list.1)
#[[1]]
#[1] 0 1 2 0 1 2 0 1 2
#
#[[2]]
#[1] 0 1 2 0 1 2 0 1 2

第二个基于同样的原则

## Replicate each unique in multiple lists
new.list.2 <- function(list) {
    unique_elements <- unique(list)
    rep(list(unique_elements), length(list)/length(unique_elements))
}

## Apply the function and unlist the nested level
unlist(lapply(my_list, new.list.2), recursive = FALSE)
#[[1]]
#[1] 0 1 2
#
#[[2]]
#[1] 0 1 2
#
#[[3]]
#[1] 0 1 2
#
#[[4]]
#[1] 0 1 2
#
#[[5]]
#[1] 0 1 2
#
#[[6]]
#[1] 0 1 2