我有一个数字向量列表,我想将它们组合成一个向量。但我无法做到这一点。该列表可以在列表元素中具有一个共同的元素。最终的矢量不应该添加两次。这是一个例子:
>lst
`1`
[1] 1 2
`2`
[2] 2 4 5
`3`
[3] 5 9 1
我想要最终结果
>result
[1] 1 2 4 5 9 1
我尝试做以下事情,而不用担心重复:
>vec<-vector()
>sapply(lst, append,vec)
和
>vec<-vector()
>sapply(lst, c, vec)
他们都没有奏效。有人可以帮我吗?
感谢。
答案 0 :(得分:42)
比上面提出的解决方案更快的解决方案:
vec<-unlist(lst)
vec[which(c(1,diff(vec)) != 0)]
答案 1 :(得分:16)
使用Reduce()
的另一个答案。
创建向量列表:
lst <- list(c(1,2),c(2,4,5),c(5,9,1))
将它们合并为一个载体
vec <- Reduce(c,lst)
vec
# [1] 1 2 2 4 5 5 9 1
只重复一次:
unique(Reduce(c,lst))
#[1] 1 2 4 5 9
如果你想在最后重复一次,你可能想要在{Rachid的回答中使用vec[which(c(1,diff(vec)) != 0)]
答案 2 :(得分:6)
你想要rle:
rle(unlist(lst))$values
> lst <- list(`1`=1:2, `2`=c(2,4,5), `3`=c(5,9,1))
> rle(unlist(lst))$values
## 11 21 22 31 32 33
## 1 2 4 5 9 1
答案 3 :(得分:5)
堆栈也会做得很好,看起来更简洁:
stack(lst)$values
答案 4 :(得分:2)
以整齐的方式进行操作:
library(tidyverse)
lst %>% reduce(c) %>% unique
这结合使用purrr的(未大写的)reduce
版本和管道。还要注意,如果列表包含以命名的向量,则最终命名将根据使用的是unlist
还是reduce
方法而有所不同。
答案 5 :(得分:0)
rbenchmark::benchmark(
"unlist" = {
vec<-unlist(a)
vec[which(diff(vec) != 0)]
},
"reduce" = {
a %>% reduce(c) %>% unique
}
)
输出:
test replications elapsed relative user.self sys.self user.child sys.child
2 reduce 100 0.036 3 0.036 0.000 0 0
1 unlist 100 0.012 1 0.000 0.004 0 0
This一个明显胜过另一个。