如何使用其列之一的值过滤/子集data.frame

时间:2013-03-04 16:54:18

标签: r dataframe

如何根据单个列中的值“截断”data.frame?例如,如果我有这个矩阵

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 个答案:

答案 0 :(得分:16)

您没有仔细阅读错误消息。在这里,我们的错误消息告诉您尚未选择任何列。你已经为行指定了条件......

> 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”向量。

答案 1 :(得分:9)

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

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

请注意,逗号和结束括号之间没有任何内容,因为这是列索引的位置。这里没有什么意思是“选择所有列”。