我正在尝试从数据框中进行选择。问题是为什么我在下面的最后一个查询返回所有5个记录而不是前两个?
> x <- c(5,1,3,2,4)
> y <- c(1,5,3,4,2)
> data <- data.frame(x,y)
> data
x y
1 5 1
2 1 5
3 3 3
4 2 4
5 4 2
> data[data$x > 4 || data$y > 4]
x y
1 5 1
2 1 5
3 3 3
4 2 4
5 4 2
答案 0 :(得分:20)
(1)对于选择数据(子集),我强烈推荐Hadley Wickhm撰写的subset
包中的plyr
函数,它更简洁易用:
library(plyr)
subset(data, x > 4 | y > 4)
更新:
有一个名为plyr
(here)的dplyr
的更新版本,它也来自Hadley,但据称更快更容易使用。如果您曾见过%.%
或%>%
等操作符,则表示他们正在使用dplyr
链接操作。
result <- data %>%
filter(x>4 | y>4) #NOTE filter(condition1, condition2..) for AND operators.
(2)|
和||
确实存在一些差异:
您可以通过执行以下操作查看帮助手册:?'|'
较短的形式以与算术运算符大致相同的方式执行元素比较。较长的形式从左到右评估仅检查每个向量的第一个元素。评估仅在确定结果之前进行。较长的形式适用于编程控制流程,通常在if子句中是首选。
> c(1,1,0) | c(0,0,0)
[1] TRUE TRUE FALSE
> c(1,1,0) || c(0,0,0)
[1] TRUE
根据您的问题,您所做的基本上是data[TRUE]
,其中......将返回完整的数据框。
答案 1 :(得分:5)
这是适合我的东西。
data[data[,1] > 4 | data[,2] > 4,1:2]
我不确定为什么你的方法不起作用,但我认为这是因为你不打算什么时候不打印。看help("[")
。
答案 2 :(得分:4)
使用您的确切代码并稍加修改
> x <- c(5,1,3,2,4)
> y <- c(1,5,3,4,2)
> data <- data.frame(x,y)
> data[data$x > 4 | data$y > 4,]
x y
1 5 1
2 1 5
有两件重要的事情需要注意。一个是||已更改为|,第二个是在最后一个方括号之前有一个额外的逗号(,),这使得过滤器可以正常工作。