gpt4 book ai didi

r - 延迟评估、dplyr "filter"和 NA

转载 作者:行者123 更新时间:2023-12-04 10:37:36 25 4
gpt4 key购买 nike

我在使用惰性求值和 dplyr 时遇到了一些愚蠢的问题。
我正在尝试过滤一些 NA s 并且不知道为什么 lazyeval 版本不起作用。可能我遗漏了一些东西,但我找不到。是这样,还是它是一个错误?

这是一个最小的可重现示例:

library(dplyr)
library(lazyeval)

data(iris)
iris$t <- c(1:140, rep(NA, 10))

#This Works
temp <- filter(iris, !is.na(t))

#This doesn't
temp <- filter_(iris, interp(~(!is.na(x)), x="t"))

两个代码运行时都不会抛出错误。

最佳答案

dplyr 已将其 NSE 系统从 lazyeval 切换到 rlang (记录在 here ),弃用 *_支持新语法的函数:

library(dplyr)

data(iris)
iris <- iris %>% mutate(t = c(1, rep(NA, 149)))

# normal NSE
iris %>% filter(!is.na(t))
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species t
#> 1 5.1 3.5 1.4 0.2 setosa 1

# string-based SE; use `rlang::sym` to convert to quosure and !! to unquote
x <- "t"
iris %>% filter(!is.na(!!rlang::sym(x)))
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species t
#> 1 5.1 3.5 1.4 0.2 setosa 1

# program your own NSE with `quo` and friends
x <- quo(t)
iris %>% filter(!is.na(!!x))
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species t
#> 1 5.1 3.5 1.4 0.2 setosa 1

# both versions work across the tidyverse
iris %>% tidyr::drop_na(!!x)
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species t
#> 1 5.1 3.5 1.4 0.2 setosa 1

# though tidyr::drop_na is happy with strings anyway
iris %>% tidyr::drop_na("t")
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species t
#> 1 5.1 3.5 1.4 0.2 setosa 1

关于r - 延迟评估、dplyr "filter"和 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44988290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com