R +将向量列表合并为一个

我只有一个数字矢量列表,我想将它们组合成一个矢量。 但是我做不到。 此列表可以具有一个在整个list元素中相同的元素。 最终向量不应将它们相加两次。 这是一个例子:

>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)

他们都没有工作。 有人可以帮我吗?

谢谢。

Rachit Agrawal asked 2020-06-18T00:18:25Z
6个解决方案
46 votes

比上述建议的解决方案更快的解决方案:

vec<-unlist(lst)
vec[which(c(1,diff(vec)) != 0)]
Rachit Agrawal answered 2020-06-18T00:18:40Z
17 votes

使用vec[which(c(1,diff(vec)) != 0)]的另一个答案。

创建向量列表:

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)]

Paul Rougieux answered 2020-06-18T00:19:17Z
6 votes

您想要的角色:

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 
Matthew Lundberg answered 2020-06-18T00:19:37Z
6 votes

stack也可以很好地做到这一点,并且看起来更加简洁:

stack(lst)$values
0mn1 answered 2020-06-18T00:19:57Z
3 votes

进行整齐的方式:

library(tidyverse)
lst %>% reduce(c) %>% unique

它使用purrr的(未大写)reduce版本与管道结合使用。 还要注意,如果列表包含命名的向量,则最终命名将有所不同,具体取决于使用的是unlist还是reduce方法。

MartijnVanAttekum answered 2020-06-18T00:20:22Z
2 votes

对Rachit和Martijn的两个答案进行基准测试

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

这显然击败了另一个。

Prradep answered 2020-06-18T00:20:50Z
translate from https://stackoverflow.com:/questions/15515390/r-combine-a-list-of-vectors-into-a-single-vector