数値ベクトルのリストが1つあり、それらを1つのベクトルに結合したい。しかし、私はそれをすることができません。このリストには、リスト要素全体に共通する要素を1つ含めることができます。最終ベクトルはそれらを2回追加するべきではありません。以下に例を示します。
>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)
どれも機能しませんでした。誰かがこれを手伝ってくれますか?
ありがとう。
上記で提案したものよりも高速なソリューション:
vec<-unlist(lst)
vec[which(c(1,diff(vec)) != 0)]
Reduce()
を使用した別の答え。
ベクトルのリストを作成します。
_lst <- list(c(1,2),c(2,4,5),c(5,9,1))
_
それらを1つのベクトルに結合する
_vec <- Reduce(c,lst)
vec
# [1] 1 2 2 4 5 5 9 1
_
繰り返されるものは1回だけ保持します。
_unique(Reduce(c,lst))
#[1] 1 2 4 5 9
_
最後にその繰り返しを保持したい場合は、@ Rachidの答えのようにvec[which(c(1,diff(vec)) != 0)]
を使用することができます
スタックもこれをうまく行い、より簡潔に見えます:
stack(lst)$values
あなたは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
きちんとした方法でそれを行う:
library(tidyverse)
lst %>% reduce(c) %>% unique
これは、パイプと組み合わせてpurrrの(大文字ではない)reduce
バージョンを使用します。また、リストにnamedベクトルが含まれる場合、unlist
メソッドまたはreduce
メソッドのどちらを使用するかによって最終的な命名が異なることに注意してください。
Rachit および Martijn による2つの回答のベンチマーク
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
これ 一方が他方を明らかに打ち負かします。