如何使用数据框中某一列的值来筛选/子集化数据框

8

如何根据单个列中的值“截断”数据框?例如,如果我有以下矩阵:

x <- c(5,1,3,2,4)
y <- c(1,5,3,4,2)
data <- data.frame(x,y)

如果我想获取所有大于或等于x的数值数据,该怎么做呢?我知道可以使用以下方法找到x值的地址:

addresses <- which(x>=2)

但我不确定如何使用它来创建一个新矩阵。以下方法无法正常工作:

data2 <- data[x>=2]
data2 <- data[which(x>=2)]

如果有人能提供任何建议,我会非常感激。
2个回答

17
你没有仔细阅读错误信息。这里,我们的错误信息告诉你,你没有选择任何列。虽然你已经指定了行的条件...
> data[which(x>=2)]
Error in `[.data.frame`(data, which(x >= 2)) : undefined columns selected

由于您想要返回所有列,只需在逗号处放置一个逗号(表示您想要返回所有列),然后您就可以开始了。
> data[which(x>=2), ] # if x is in your workspace
  x y
1 5 1
3 3 3
4 2 4
5 4 2
> ## with(data, data[x >= 2, ] # if x is not in your workspace

这里有一个需要注意的点:你可以直接像这样创建你的data.frame
data <- data.frame(x = c(5,1,3,2,4), y = c(1,5,3,4,2))

这就是为什么我建议这样做。首先,你的工作区没有不必要的对象。其次,你不会被欺骗认为某些东西正在工作,而实际上并没有。你写道:"我知道我可以使用 addresses <- which(x>=2) 找到 x 值的地址。" 这是正确的,但也许你没有意识到(因此提出了这个问题),你实际上并没有访问来自 data.frame 的 "x",而是来自你的工作区的 "x" 向量。

谢谢,我不确定错误的含义,但是看到你的解决方案后我现在明白了。再次感谢。 - Thomas
我们不仅在同一时间发布了相同的答案,而且我认为我们也在同一时间进行了相同的编辑 :) - juba
如果Ananda Mahto的回答解决了你的问题,请不要忘记用绿色标记接受它! - juba
1
值得指出的是,如果你遵循额外的建议(你应该这样做!),上面的代码将无法工作,因为x在你的数据框之外不会被定义。你需要使用类似于data[which(data$x >= 2), ]或者with(data, data[x >= 2, ])的东西来代替。这是一件好事,因为它将确保你不会改变x或者你的数据而不改变另一个,否则可能会让你陷入麻烦。 - Gregor Thomas
@shujaa,谢谢。我本来是想编辑它的,但因为同时回答另一个问题而忘记了!糟糕。 - A5C1D2H2I1M1N2O1R2T1

9

首先,data不是矩阵,而是数据框。其次,您要尝试的是按行索引数据框。这可以通过在[运算符的第一部分中指定条件来完成。就像这样:

data2 <- data[data$x>=2,]

请注意,逗号和闭括号之间没有任何内容,因为这是用于列索引的位置。在这里,“什么都没有”意味着“选择所有列”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接