web-dev-qa-db-ja.com

R +ベクトルのリストを単一のベクトルに結合する

数値ベクトルのリストが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)

どれも機能しませんでした。誰かがこれを手伝ってくれますか?

ありがとう。

45
Rachit Agrawal

上記で提案したものよりも高速なソリューション:

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

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)]を使用することができます

16
Paul Rougieux

スタックもこれをうまく行い、より簡潔に見えます:

stack(lst)$values
6
0mn1

あなたは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 
6

きちんとした方法でそれを行う:

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

これは、パイプと組み合わせてpurrrの(大文字ではない)reduceバージョンを使用します。また、リストにnamedベクトルが含まれる場合、unlistメソッドまたはreduceメソッドのどちらを使用するかによって最終的な命名が異なることに注意してください。

3

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

これ 一方が他方を明らかに打ち負かします。

1
Prradep