如何根据单个列中的值“截断”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)]
如果有人可以提供任何建议,我真的很感激。
答案 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,]
请注意,逗号和结束括号之间没有任何内容,因为这是列索引的位置。这里没有什么意思是“选择所有列”。