Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R+;将向量列表合并为单个向量_R_List_Vector_Append_Sapply - Fatal编程技术网

R+;将向量列表合并为单个向量

R+;将向量列表合并为单个向量,r,list,vector,append,sapply,R,List,Vector,Append,Sapply,我有一个数值向量列表,我想把它们组合成一个向量。但我无法做到这一点。此列表中可以有一个跨列表元素的公共元素。最终向量不应将它们相加两次。以下是一个例子: >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) >vecsaply(lst、a

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

>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)
>vecsaply(lst、append、vec)

>vecsaply(lst、c、vec)
他们都没有工作。有人能帮我吗

谢谢。

您想要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 
rle(未列出(lst))$value
>lst rle(未列出(lst))$values
## 11 21 22 31 32 33 
##  1  2  4  5  9  1 

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

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

vecstack也能很好地完成这一任务,而且看起来更简洁:

stack(lst)$values

另一个答案是使用
Reduce()

创建向量列表:

lst <- list(c(1,2),c(2,4,5),c(5,9,1))

如果你想在最后重复这个问题,你可能想使用
vec[which(c(1,diff(vec))!=0)]
,就像@Rachid的答案一样

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

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

通过和对两个答案进行基准测试


一个明显地打败了另一个。

谢谢@JoshO'Brien。但这并不能删除重复的值。@joran我怀疑
unique
是否足够细粒度
unique
可以很容易地删除相邻列表组件之间的多个公共元素。注意
unique(unlist(lst))
不会给出OP想要的值。你是说你不想让任何重复的值彼此相邻吗?或者你是说如果一个向量的结尾与下一个向量的开头匹配,你就不想重复一个元素?提供更多示例可能会有所帮助…@JoshO'Brien
unique()
将剥离OP声称应该在输出中的
1
中的一个。这是可行的,但我不确定如果列表元素中有重复的值:
unique(do.call(c,lst))
。根据@MatthewLundberg的福音,
rle(do.call(c,lst))$values
。基于我的基准测试,Matthew的解决方案更快。我也这么认为。我遇到的一个问题是,我不知道他们是否希望删除列表元素中的重复值……这实现了我试图做的事情。我还可以使用以下选项来完成它:
vec这可能更快,因为它做的工作更少(在我的机器上,在您的小示例上更快)。查看
rle
的代码。你可以加上它作为另一个答案。@MatthewLundberg你是如何计算时间的?
vec[which(c(1,diff(vec))!=0)]
for?但是它比上面建议的要快吗?@Galaxy这是在删除连续重复的同时保留被其他元素分隔的重复元素
diff()
将以前的值减去当前值。如果
diff(vec)
等于零,则表示当前值和上一个值相同,可以删除此值。例如,使用
lst实际上
unlist(lst)
Reduce(c,lst)
更容易。
vec <- Reduce(c,lst)
vec
# [1] 1 2 2 4 5 5 9 1
unique(Reduce(c,lst))
#[1] 1 2 4 5 9
library(tidyverse)
lst %>% reduce(c) %>% unique
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