R +将矢量列表组合成单个矢量

Rac*_*wal 47 r list vector append sapply

我有一个数字向量列表,我想将它们组合成一个向量.但我无法做到这一点.该列表可以在列表元素中具有一个共同的元素.最终的矢量不应该添加两次.这是一个例子:

>lst
`1`
[1] 1 2
`2`
[2] 2 4 5
`3`
[3] 5 9 1
Run Code Online (Sandbox Code Playgroud)

我想要最终结果

>result
[1] 1 2 4 5 9 1
Run Code Online (Sandbox Code Playgroud)

我试着做以下事情,而不用担心重复:

>vec<-vector()
>sapply(lst, append,vec)
Run Code Online (Sandbox Code Playgroud)

>vec<-vector()
>sapply(lst, c, vec)
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Rac*_*wal 46

比上面提出的解决方案更快的解决方案:

vec<-unlist(lst)
vec[which(c(1,diff(vec)) != 0)]
Run Code Online (Sandbox Code Playgroud)

  • 什么是`vec [which(c(1,diff(vec))!= 0)]`for? (6认同)
  • 但它比上面提出的更快吗? (4认同)
  • @Galaxy 这是删除连续重复,同时保留被其他元素分隔的重复元素。`diff()` 将前一个值减去当前值。如果 `diff(vec)` 等于 0,则表示当前值和前一个值相同,并且可以删除该值。例如使用`lst &lt;- list(c(1,2),c(2,4,5),c(5,9,1))`和`vec&lt;-unlist(lst)`。`vec[which(c(1,diff(vec)) != 0)]` 将删除所有连续的重复,但它会在最后保留重复的。 (2认同)

Pau*_*eux 17

另一个答案用Reduce().

创建向量列表:

lst <- list(c(1,2),c(2,4,5),c(5,9,1))
Run Code Online (Sandbox Code Playgroud)

将它们组合成一个向量

vec <- Reduce(c,lst)
vec
# [1] 1 2 2 4 5 5 9 1
Run Code Online (Sandbox Code Playgroud)

保留重复的一次:

unique(Reduce(c,lst))
#[1] 1 2 4 5 9
Run Code Online (Sandbox Code Playgroud)

如果你想在最后保留重复的那个,你可能想要vec[which(c(1,diff(vec)) != 0)]在@ Rachid的答案中使用

  • 事实上`unlist(lst)`比`Reduce(c,lst)`更容易。 (2认同)

Mat*_*erg 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 
Run Code Online (Sandbox Code Playgroud)

  • 这实现了我想做的事情.我也可以使用以下选项:`vec <-unlist(lst); vec [其中(c(1,diff(vec))!= 0)]`现在我想知道哪个更好? (2认同)

0mn*_*mn1 6

stack也可以做得很好,看起来更简洁:

stack(lst)$values
Run Code Online (Sandbox Code Playgroud)