2

特定の条件に応じて、データ フレームから大量のデータを選択する必要があります。データ フレームは、おおよそ次のようになります。

  F1 F2 D1 D2
1 A1 B1  1  0
2 A1 B1  1  1
3 A1 B1  0  0
4 A1 B2  1  0
5 A1 B2  0  0
6 A2 B2  1  0
7 A2 B2  1  1

Fx因子で、Dxはデータ値です。私がしなければならないことは次のとおりです。

  1. 特定のパターンに一致するデータ値を持つ行を検索します。
  2. そのパターンに一致する各行について、同じ因子を持つすべての行を見つけます
  3. 一意の因子の組み合わせごとに、その組み合わせを持つすべての行に何らかの操作を適用します

例えば、

factors <- unique(data[D1==1 & D2 == 1, c("F1","F2")])

ステップ1と2のほとんどを教えてくれます。

そして

data[data$F1 %in% factors$F1 & data$F2 %in% factors%F2,]

解決策に近づいていますが、上記の例のデータでは、これによりすべての行が選択されます。ただし、行 4 と 5 は完全に一致しないため、選択しないでください。%in% 一致が同じ行で発生することを必要とする何らかの条件を追加するにはどうすればよいですか?

これは一般的な操作であるべきだと思うので、Rにはおそらくこれを行うための賢い方法があります。

何か案は????ありがとう。

4

2 に答える 2

1

パッケージのインデックスを使用して、data.table操作する必要のあるすべての行を選択できます。

data <- data.table(data,key="F1,F2")
data[unique(data[D1 == 1 & D2 == 1,list(F1,F2)])]
于 2012-06-06T14:36:07.183 に答える
0

tapplyandの仕事のように感じpasteます...たとえば、data2 をデータ オブジェクトと同じように定義しましょう。説明するのに役立ちます)...

  F1 F2 D1 D2 D3 D4 Val
1 A1 B1  1  1  0  1   7
2 A1 B1  1  0  1  1  19
3 A2 B1  1  1  1  1  43

次のコマンドを確認してください。

tapply(data2$Val,paste(data2$F1,data2$F2,sep="~"),sum)

次の出力が得られるはずです。

A1~B1 A2~B1 
   26    43 

R が F1 と F2 の可能な組み合わせごとに Val の合計を計算していることは明らかです (実際には、コマンドが示すように、F1 と F2 のペーストを調べますが、これは同じことになります)... A1~ の場合B1 の合計は 26 (7 + 19) で、A2~B1 の合計は 43 です (そのような行は 1 つしかありません)。sumタップリーをに変更するlengthと、そのような行の数などを取得できます。

お役に立てれば... :)

編集:あなたの変更を見ました。F1 と F2 の組み合わせが因子オブジェクトにリストされている F1 と F2 の組み合わせの 1 つであるデータのすべての行の直後にいる場合は、次のように使用できますpaste

data[paste(data$F1,data$F2,sep="~") %in% paste(factors$F1,factors$F2,sep="~"),]

sep="~"厳密には必要ありません。習慣の力だけです。上記の行は、あなたが望む行を提供するはずです。特定の F1/F2 の組み合わせを持つ行のサブセットごとに関数を実行する場合は、上記で説明したように tapply を使用します:)


便宜上、data2 の dput を以下に示します。

structure(list(
F1 = structure(c(1L, 1L, 2L), .Label = c("A1", "A2"), class = "factor"), 
F2 = structure(c(1L, 1L, 1L), .Label = "B1", class = "factor"), 
D1 = c(1L, 1L, 1L), D2 = c(1L, 0L, 1L), D3 = c(0L, 1L, 1L), 
D4 = c(1L, 1L, 1L), Val = c(7, 19, 43)), 
.Names = c("F1", "F2", "D1", "D2", "D3", "D4", "Val"), 
row.names = c(NA, -3L), class = "data.frame")
于 2012-06-06T07:55:24.843 に答える