8

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

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

我想要所有大于或等于 x 的值的数据,我该怎么做?我知道我可以使用

addresses <- which(x>=2)

但我不确定如何使用它来制作新矩阵。以下不起作用:

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

如果有人可以提供任何建议,我将不胜感激。

4

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

于 2013-03-04T16:57:30.577 回答
9

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

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

Note that you have nothing between the comma and the closing bracket, because this is the place for column indexing. And here nothing means "select all columns".

于 2013-03-04T16:57:40.000 回答