我在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,]
任何帮助都将不胜感激。
答案 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