61

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

それらのどれも機能しませんでした。誰かがこれについて私を助けることができますか?

ありがとう。

4

6 に答える 6

58

上で提案されたものよりも速い解決策:

vec<-unlist(lst)
vec[which(c(1,diff(vec)) != 0)]
于 2013-03-21T05:01:22.600 に答える
22

を使用した別の回答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

その繰り返しを最後に残したい場合はvec[which(c(1,diff(vec)) != 0)]、@Rachidの回答のように使用することをお勧めします

于 2015-12-29T15:30:28.827 に答える
8

あなたは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 
于 2013-03-20T04:46:21.323 に答える
7

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

stack(lst)$values
于 2014-03-19T00:36:28.787 に答える
4

RachitMartijnによる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

これは明らかに他のものを打ち負かしました。

于 2018-11-27T13:26:38.927 に答える
3

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

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

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

于 2018-09-04T23:34:06.957 に答える