0

彼のデータが最近ここで使用されている場合:

data <- data.frame(name = rep(letters[1:3], each = 3), 
                   var1 = rep(1:9), var2 = rep(3:5, each = 3))

  name var1 var2
1    a    1    3
2    a    2    3
3    a    3    3
4    b    4    4
5    b    5    4
6    b    6    4
7    c    7    5
8    c    8    5
9    c    9    5

var2 == 4 の行を探すことができます。

data[data[,3] == 4 ,] # equally data[data$var2 == 4 ,]

#  name var1 var2
#4    b    4    4
#5    b    5    4
#6    b    6    4

または、var1 と var2 の両方が ==4 である行

data[data[,2] == 4 &  data[,3] == 4,]

#  name var1 var2
#4    b    4    4

私が得られないのは、これが理由です:

data[ data[ , 2:3 ] == 4 ,]

これを与える:

     name var1 var2
4       b    4    4
NA   <NA>   NA   NA
NA.1 <NA>   NA   NA
NA.2 <NA>   NA   NA

#I would still hope to get 
 #  name var1 var2
#4    b    4    4

NAはどこから来たのですか?

4

4 に答える 4

3

サブセット化している論理はマトリックスです。

> sel <- data[ , 2:3 ] == 4
> sel
       var1  var2
 [1,] FALSE FALSE
 [2,] FALSE FALSE
 [3,] FALSE FALSE
 [4,]  TRUE  TRUE
 [5,] FALSE  TRUE
 [6,] FALSE  TRUE
 [7,] FALSE FALSE
 [8,] FALSE FALSE
 [9,] FALSE FALSE

によるとhelp("[.data.frame")

[ を使用した行列インデックス (論理行列または 2 列の整数行列 i を使用した x[i]) は推奨されておらず、ほとんどサポートされていません。抽出のために、x は最初にマトリックスに強制されます。置換の場合、論理行列 (のみ) を使用して、行列の場合と同じ方法で置換する要素を選択できます。

しかし、それはこの形式を意味します:

> data[ sel ]
[1] "b" "4" "5" "6" "4"

不良。ただし、行のみが必要であると伝え (末尾のコンマを使用)、インデックスを作成するマトリックスを指定しているという点で、あなたがしていることはさらに無意味です!

> data[sel,]
     name var1 var2
4       b    4    4
NA   <NA>   NA   NA
NA.1 <NA>   NA   NA
NA.2 <NA>   NA   NA

本当に行列形式を使用したい場合は、apply行全体に論理演算を適用するために使用できます。

于 2013-02-06T21:27:33.767 に答える
2

あなたdata[,2:3]==4は次のとおりです。

R> data[,2:3]==4
       var1  var2
 [1,] FALSE FALSE
 [2,] FALSE FALSE
 [3,] FALSE FALSE
 [4,]  TRUE  TRUE
 [5,] FALSE  TRUE
 [6,] FALSE  TRUE
 [7,] FALSE FALSE
 [8,] FALSE FALSE
 [9,] FALSE FALSE

次に、このマトリックスを使用してデータ フレームの行にインデックスを付けようとします。これを行うために、R は最初に行列をベクトルに変換するようです:

R> as.vector(data[,2:3]==4)
 [1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[12] FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE

data次に、このベクトルに基づいての行を選択します。4 番目のTRUE値は 4 番目の行を選択しますが、他の 3 つのTRUE値は「範囲外」の行を選択するため、 を返しNAます。

于 2013-02-06T21:30:25.153 に答える
0
    data[ data[ , 2 ] == 4 | data[,3] == 4,]

    name  var1 var2
 4    b    4    4
 5    b    5    4
 6    b    6    4

アトミック要素を比較する必要があるのに対し、 c() はベクトルを構築するため、メソッドが機能しないと思われます。

于 2013-02-06T21:27:27.490 に答える
0

ベクトルではなく行列をインデックスに渡しているためです。

> data[ , 2:3 ] == 4
       var1  var2
 [1,] FALSE FALSE
 [2,] FALSE FALSE
 [3,] FALSE FALSE
 [4,]  TRUE  TRUE
 [5,] FALSE  TRUE
 [6,] FALSE  TRUE
 [7,] FALSE FALSE
 [8,] FALSE FALSE
 [9,] FALSE FALSE

インデックス付けが機能するベクトルにマトリックスを折りたたむ場合は、次の 2 つのオプションがあります。

data[ apply(data[ , 2:3 ] == 4, 1, all) ,]
data[ rowSums(data[ , 2:3 ] == 4) == 2 ,]
于 2013-02-06T21:27:53.993 に答える