如何使用两列条件过滤数据框?

时间:2013-11-19 23:33:46

标签: r dataframe

我正在尝试从数据框中进行选择。问题是为什么我在下面的最后一个查询返回所有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

3 个答案:

答案 0 :(得分:20)

(1)对于选择数据(子集),我强烈推荐Hadley Wickhm撰写的subset包中的plyr函数,它更简洁易用:

library(plyr)
subset(data, x > 4 | y > 4)

更新:

有一个名为plyrhere)的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

有两件重要的事情需要注意。一个是||已更改为|,第二个是在最后一个方括号之前有一个额外的逗号(,),这使得过滤器可以正常工作。