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 行,但其他三个TRUE值选择“越界”行,因此它们返回NA's。

于 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

如果您想将矩阵折叠成一个可以使用索引的向量,这里有两个选项:

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