当有NA时,将dplyr过滤器转换为基础R.

时间:2016-05-31 17:00:51

标签: r dplyr

我在dplyr中有一个工作filter语句,我无法转换为基础R

library(dplyr)
x <- data.frame(
    v1 = c("USA", "Canada", "Mexico"),
    v2 = c(NA, 1:5)
  )

x %>% filter(v1=="Canada",v2 %in% 3:5)

x[x$v1=="Canada" && x$v2 %in% 3:5,]

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

举例说明:

library(dplyr)
x <- data.frame(
   v1 = c("USA", "Canada", "Mexico"),
   v2 = c(NA, 1:5)
)

# filter 
x %>% filter(v1=="Canada",v2 %in% 3:5)
      v1 v2
1 Canada  4

# your approach
x[x$v1=="Canada" && x$v2 %in% 3:5,]
 v1 v2
<0 rows> (or 0-length row.names)

# second & removed
x[x$v1=="Canada" & x$v2 %in% 3:5,]
      v1 v2
5 Canada  4

除了rowname之外,它也给出了相同的结果。

请查看此示例以了解之前发生的事情(取自here

-2:2 >= 0
[1] FALSE FALSE  TRUE  TRUE  TRUE
-2:2 >= 0 & -2:2 <= 0
[1] FALSE FALSE  TRUE FALSE FALSE
-2:2 >= 0 && -2:2 <= 0
[1] FALSE

在某些情况下,您可能会遇到NA的问题。然后建议将逻辑语句包装到which中。 filter默认情况下会过滤NA个。 E.g。

# will include NA:
x[x$v2 > 3,]
       v1 v2
NA   <NA> NA
5  Canada  4
6  Mexico  5

# will exclude NA 
x[which(x$v2 > 3),]
      v1 v2
5 Canada  4
6 Mexico  5

答案 1 :(得分:1)

subset位于基础R中,其功能与filter中的dplyr类似。子集是否足够,或者您是否因某种原因需要括号表示法?

> x <- data.frame(
+     v1 = c("USA", "Canada", "Mexico"),
+     v2 = c(NA, 1:5)
+ )

通过dplyr

> x %>% filter(v1=="Canada",v2 %in% 3:5)
      v1 v2
1 Canada  4

通过基地R / subset

> subset(x, v1 == 'Canada' & v2 %in% 3:5)
      v1 v2
5 Canada  4