我有一个清单(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
我该怎么做?我不知道:/请帮帮我
答案 0 :(得分:1)
我们使用list
遍历vector
个lapply
,创建一个ave
到order
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)
您可以使用lapply
和unique
多次重复每个唯一元素。在这里,我只是在两个元素上显示它,列表的长度无关紧要:
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