如何以编程方式过滤 dplyr 中的列?
How to programmatically filter columns in dplyr?
如果在函数被调用之前我不想指定列,我将如何创建一个函数来删除列中的 NA 值?
minimal_case <- function(column_name = "a") {
enquo_name <- enquo(column_name)
example <- tibble(a = c(NA, 1))
print(filter(example, !is.na(a)))
print(filter(example, !is.na(rlang::UQ(enquo_name))))
}
第一个打印语句的输出是:
# A tibble: 1 x 1
a
<dbl>
1 1
第二个打印语句的输出是:
# A tibble: 2 x 1
a
<dbl>
1 NA
2 1
如何让第二个打印语句与第一个匹配?
column_name
参数似乎是一个字符串。在这种情况下,您可以使用 rlang::sym
:
minimal_case <- function(column_name = "a") {
example <- tibble(a = c(NA, 1))
print(filter(example, !is.na(a)))
print(filter(example, !is.na(!!rlang::sym(column_name))))
}
这里有一篇关于如何在 dplyr 中做这样的事情的很好的文章:http://dplyr.tidyverse.org/articles/programming.html
这个案例的重点是您不必在参数中引用 a
。您也可以使用 !!
而不是 UQ
minimal_case <- function(column_name = a) {
enquo_name <- enquo(column_name)
example <- tibble(a = c(NA, 1))
print(filter(example, !is.na(a)))
print(filter(example, !is.na(!!enquo_name)))
}
如果在函数被调用之前我不想指定列,我将如何创建一个函数来删除列中的 NA 值?
minimal_case <- function(column_name = "a") {
enquo_name <- enquo(column_name)
example <- tibble(a = c(NA, 1))
print(filter(example, !is.na(a)))
print(filter(example, !is.na(rlang::UQ(enquo_name))))
}
第一个打印语句的输出是:
# A tibble: 1 x 1
a
<dbl>
1 1
第二个打印语句的输出是:
# A tibble: 2 x 1
a
<dbl>
1 NA
2 1
如何让第二个打印语句与第一个匹配?
column_name
参数似乎是一个字符串。在这种情况下,您可以使用 rlang::sym
:
minimal_case <- function(column_name = "a") {
example <- tibble(a = c(NA, 1))
print(filter(example, !is.na(a)))
print(filter(example, !is.na(!!rlang::sym(column_name))))
}
这里有一篇关于如何在 dplyr 中做这样的事情的很好的文章:http://dplyr.tidyverse.org/articles/programming.html
这个案例的重点是您不必在参数中引用 a
。您也可以使用 !!
而不是 UQ
minimal_case <- function(column_name = a) {
enquo_name <- enquo(column_name)
example <- tibble(a = c(NA, 1))
print(filter(example, !is.na(a)))
print(filter(example, !is.na(!!enquo_name)))
}