R + 将一个向量列表组合成一个向量

Posted

技术标签:

【中文标题】R + 将一个向量列表组合成一个向量【英文标题】:R + combine a list of vectors into a single vector 【发布时间】:2013-03-09 01:34:57 【问题描述】:

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

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

他们都没有工作。有人可以帮我解决这个问题吗?

谢谢。

【问题讨论】:

谢谢@JoshO'Brien。但这不会删除重复的值。 @joran 我怀疑unique 是否足够细粒度; unique 可以很容易地删除 adjacent 列表组件之间的超过 1 个公共元素。注意unique(unlist(lst)) 不会给出 OP 想要的。 您是说您不希望任何重复的值彼此相邻吗?或者你是说如果一个向量的结尾与下一个向量的开头匹配,你只是不想重复一个元素?提供更多示例可能会有所帮助... @JoshO'Brien unique() 将删除 OP 声称应该在输出中的 1s 之一。 这行得通,但我不确定如果它在列表元素中有重复值是否行不通:unique(do.call(c, lst))。根据@MatthewLundberg 的福音,rle(do.call(c, lst))$values。根据我的基准,Matthew 的解决方案更快。 【参考方案1】:

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

vec<-unlist(lst)
vec[which(c(1,diff(vec)) != 0)]

【讨论】:

vec[which(c(1,diff(vec)) != 0)] 是什么? 但它比上面建议的更快吗? @Galaxy 这是为了删除连续重复,同时保留被其他元素分隔的重复元素。 diff() 将前一个值减去当前值。如果diff(vec) 等于零,则表示当前值和前一个值相同,可以删除此值。例如使用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】:

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

【讨论】:

事实上unlist(lst)Reduce(c,lst) 更容易。【参考方案3】:

你想要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 

【讨论】:

我也是这么想的。我遇到的一个问题是我不知道他们是否想删除列表元素中的重复值... 这实现了我想要做的事情。我也可以使用以下选项:vec&lt;-unlist(lst); vec[which(c(1,diff(vec)) != 0)] 现在我想知道哪个更好? 这可能会更快,因为它做的工作更少(在你的小例子上更快,在我的机器上)。查看rle 的代码。您可以将其添加为另一个答案。 @MatthewLundberg 你是如何计算时间的??【参考方案4】:

stack 也能很好地做到这一点,而且看起来更简洁:

stack(lst)$values

【讨论】:

【参考方案5】:

通过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

This 一个明显胜过另一个。

【讨论】:

【参考方案6】:

以整洁的方式进行:

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

这将 purrr 中的(未大写的)reduce 版本与管道结合使用。另请注意,如果列表包含 named 向量,则最终命名将根据使用的是unlist 还是reduce 方法而有所不同。

【讨论】:

以上是关于R + 将一个向量列表组合成一个向量的主要内容,如果未能解决你的问题,请参考以下文章

如何将词嵌入向量组合成一个向量?

将向量中的所有元素组合成一个新的字符串 MFC VC++

【R】数值型向量及运算

将数据框的一列与另一列匹配,拉入其他列,组合成大数据集

如何将两个 std::vector 与 std::pair 组合成一个 std::vector

R语言学习/Day1