2013-02-06 101 views
0

如果我們有他的數據recentely used here子集,解釋NA輸出

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 

哪裏做來港從何而來?

+0

我認爲這是一個粗糙的downvote。 – user1322296

回答

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行,但其他三個TRUE值選擇「越界」行,因此它們返回NA's。

+0

+1這完全清除它! – user1322296

0
data[ data[ , 2 ] == 4 | data[,3] == 4,] 

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

我懷疑你的方法不起作用,因爲c()建立一個向量,而你需要比較原子元素。

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")

矩陣索引(X [I]與邏輯或2-柱整數矩陣我) 使用[不推薦,並勉強支持。爲了提取,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到跨行應用邏輯運算。

+0

+1感謝您的澄清,我知道這是錯誤的方式,我只是不知道爲什麼。此外,我知道幫助,但希望你意識到'幫助(「[。data.frame」)'可能會對不熟悉的人模糊不清。 – user1322296

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 

如果你想矩陣坍塌成索引工作在這裏的向量兩種選擇:

data[ apply(data[ , 2:3 ] == 4, 1, all) ,] 
data[ rowSums(data[ , 2:3 ] == 4) == 2 ,]