3

以前の質問に親切に答えていただきありがとうございます。list1 と list2 の 2 つのリストがあります。list1 の各オブジェクトが list2 の各オブジェクトに含まれているかどうかを知りたいです。例えば:

> list1
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

> list2
[[1]]
[1] 1 2 3

[[2]]
[1] 2 3

[[3]]
[1] 2 3

ここに私の質問があります: 1.) オブジェクトがリスト内の別のオブジェクトのサブセットであるかどうかを R に確認させるにはどうすればよいですか? たとえばlist2[[3]]={2,3}、 (サブセットの) に含まれているかどうかを確認したいと思いますlist1[[2]]={2}。私がするときlist2[[3]] %in% list1[[2]]、私は得[1] TRUE FALSEます。しかし、これは私がやりたいことではありませんか?! list2[[3]]が のサブセットであるかどうかを確認したいだけですlist1[[2]]。つまり、集合論的概念のように {2,3} \subset of {3} ですか? R は %in% コマンドで実行しているように見えるので、要素ごとのチェックは実行したくありません。助言がありますか?

2.) すべてのペアワイズ サブセット比較 (つまり、すべての組み合わせに対して のサブセット) を効率的に行う何らかの方法はありますか?list1[[i]]質問1の回答が得られたら、何か機能しますか? フィードバックをありがとう!list2[[j]]i,jouter(list1,list2, func.subset)

4

4 に答える 4

5

setdiff一意の値を比較します

length(setdiff(5, 1:5)) == 0

または、all(x %in% y)うまく機能します。

すべての比較を行うには、次のようにします。

dt <- expand.grid(list1,list2)
dt$subset <- apply(dt,1, function(.v) all(.v[[1]] %in% .v[[2]]) )


  Var1    Var2 subset
1    1 1, 2, 3   TRUE
2    2 1, 2, 3   TRUE
3    3 1, 2, 3   TRUE
4    1    2, 3  FALSE
5    2    2, 3   TRUE
6    3    2, 3   TRUE
7    1    2, 3  FALSE
8    2    2, 3   TRUE
9    3    2, 3   TRUE

大量のデータを処理する場合、これを行う最速の方法ではないことに注意してくださいexpand.grid(その点では dwin のソリューションの方が優れています)。

于 2013-01-19T01:10:04.617 に答える
2

setsパッケージは次のように使用できます。

library(sets)
is.subset <- function(x, y) as.set(x) <= as.set(y)

outer(list1, list2, Vectorize(is.subset))
#      [,1]  [,2]  [,3]
# [1,] TRUE FALSE FALSE
# [2,] TRUE  TRUE  TRUE
# [3,] TRUE  TRUE  TRUE

@Michaelまたは@DWinのベースバージョンis.subsetも同様に機能しますが、質問のパート2についてouterは、それが進むべき道だと主張します。

于 2013-01-19T01:50:10.897 に答える
1
is.subset <- function(x,y) {length(setdiff(x,y)) == 0}

まず、list2 項目のサブセットである list1 要素の組み合わせ:

> sapply(1:length(list1), function(i1) sapply(1:length(list2), 
                 function(i2) is.subset(list1[[i1]], list2[[i2]]) ) )
      [,1] [,2] [,3]
[1,]  TRUE TRUE TRUE
[2,] FALSE TRUE TRUE
[3,] FALSE TRUE TRUE

それから、リスト 1 項目 (すべて長さ 1) のサブセットである list2 項目 (すべて長さ > 1) の驚くべき欠如:

> sapply(1:length(list1), function(i1) sapply(1:length(list2), 
                 function(i2) is.subset(list2[[i2]], list1[[i1]]) ) )
      [,1]  [,2]  [,3]
[1,] FALSE FALSE FALSE
[2,] FALSE FALSE FALSE
[3,] FALSE FALSE FALSE
于 2013-01-19T01:35:09.520 に答える