0

次の形式の2行のマトリックス「マット」があります。

mat:

1  0
1  2
1  3
1  5
1  9 
1  4
1  7
1  11
1  8
2  3
2  4
2  2
3  9
3  0
4  0
5  0
5  13
6  22
6  0

数値 0 のみを含む「neg」という変数を定義します。

neg <- 0

マトリックスの最初の列で、2 番目の列に「neg」しかない要素を選択したいと思います。

そのため、2 番目の行に少なくとも 1 つの 0 がある最初の行のすべての数値を選択する mat[mat[,1]%in%0,1] と言う代わりに、0 のみを持つものだけを取得したいと思います。この例では 4 つだけが選択されます。

4

2 に答える 2

3

私はこれに使用plyrします。ただし、最初にデータを読んでください。

dat = read.csv(textConnection("1  0
1  2
1  3
1  5
1  9 
1  4
1  7
1  11
1  8
2  3
2  4
2  2
3  9
3  0
4  0
5  0
5  13
6  22
6  0"), header = FALSE, sep = "")

そして、plyrをロードした後、列にV1等しい値のみを持つ一意のカテゴリを見つけて、リストを作成したいと思います。negV2true_values

require(plyr)
neg = 0
test = ddply(dat, .(V1), summarise, bool = all(V2 == neg))
>     test
  V1  bool
1  1 FALSE                                                                  
2  2 FALSE                                                                  
3  3 FALSE                                                                  
4  4  TRUE                                                                  
5  5 FALSE                                                                  
6  6 FALSE 
true_values = test[["V1"]][test[["bool"]]]
> true_values
[1] 4

このリストを取得したら、元のデータセットをサブセット化できます。

> dat[dat[["V1"]] %in% true_values,]
   V1 V2
15  4  0

または、次の要素から選択する要素を直接指定するブールベクトルを生成することもできますdat

test = ddply(dat, .(V1), mutate, bool = all(V2 == neg))

...そしてサブセットを実行します:

> dat[test[["bool"]],]
   V1 V2
15  4  0 
于 2013-01-10T10:32:14.310 に答える
0

これは特定のケースでのみ機能しますが、tapply を使用できます。

as.numeric(names(which(tapply(a[,2],a[,1],sum)==0)))

最初の列を因子と考える場合、tapply は最初の列の因子の水準ごとに 2 番目の列の合計を計算します。

そして、複数の値の場合、次のようなもの-確かに醜い-が機能するはずです:

as.numeric(names(which(tapply(dat[,2],dat[,1],FUN=function(x){all(unique(x)%in%neg & length(x)==length(neg))}))))
于 2013-01-11T12:54:11.393 に答える