我刚才刚刚被dplyr :: filter咬了过滤时从我的tibble中删除了大量的NA。我主要处理完整的数据集,但现在我想进入比较混乱的数据。因此,我想创建一个具有与过滤器相同功能但不删除NA的功能。以下是一些建议:Why does dplyr's filter drop NA values from a factor variable?或How to filter data without losing NA rows using dplyr但是在处理大量缺失数据值和许多比较时它们是繁琐的解决方案。下面是一些解决它的方法的示例。
这是样本数据,A列和B列都缺少NA
df = tibble(A = rep(c(1,2,3,NA,NA),10000),
B = rep(c(NA,1,2,3,4),10000))
这是我想做的直观。返回A不等于B的值,但是它会丢弃所有的NA(如预期的那样)。
df %>% filter(A != B)
第一个解决方案:解决此问题的解决方案是使用基数R中的%in%,但是您需要逐行执行此操作然后取消组合,这样会降低进程的速度。但是当它们出现在A或B中时,通过保持NAs来给出正确的结果。
df %>% rowwise() %>% filter(!A %in% B) %>% ungroup()
第二个解决方案:之前建议的另一个选项是使用|如果他们是NA,则返回A和B.
df %>% filter(A != B|is.na(A)|is.na(B))
现在,如果您正在进行多次过滤和比较,这会变得很烦人,您可能会在某个地方填充!因此,是否可以创建一个自动使is.na()保持内置的功能。也许这样的事情。
filter_keepna = function(data, expression){
data %>% filter(expression|is.na(column1)|is.na(column2)
}
我没有足够的知识来获得这样的工作。但我假设各个平台上的所有评论都认为这是必需的。
试试coalesce
df %>% filter(coalesce(A != B, TRUE))
在您的函数中,您可以使用这些函数从rlang包中进行整理评估。 enquo()
,f_lhs()
和quo_get_expr()
函数可以帮助从表达式中提取变量。您还需要bang bang运算符(!!
)来解释这些情况。在你的例子中,是:
filter_keepna <- function(data, expre){
expre <- enquo(expre) #Quotation
data %>%
filter(!!expre | #!! is a tidy evaluator
# get quoted left variable from expre
is.na(!!f_lhs(quo_get_expr(expre))) |
# get quoted right variable from expre
is.na(!!f_rhs(quo_get_expr(expre))))
}
在示例数据中使用filter_keepna()
函数:
df = tibble(A = rep(c(1,2,3,NA,NA),10000),
B = rep(c(NA,1,2,3,4),10000))
filter_keepna(df, A != B)
# A tibble: 40,000 x 2
# A B
# <dbl> <dbl>
# 1 2 1
# 2 3 2
# 3 NA 3
# 4 NA 4
# 5 2 1
# 6 3 2
# 7 NA 3
# 8 NA 4
# 9 2 1
# 10 3 2
# # ... with 39,990 more rows
有关rlang包的quotation reference和Quosure getters reference的详细信息。 .........