【发布时间】:2019-07-06 19:01:40
【问题描述】:
我最近才被 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 中时,通过保留 NA 来给出正确的结果。
df %>% rowwise() %>% filter(!A %in% B) %>% ungroup()
第二个解决方案:之前建议的另一个选项是使用 |如果 A 和 B 为 NA,则返回它们。
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)
}
我没有足够的知识来完成这样的事情。但我从各种平台上的所有 cmets 中假设这是必需的。
【问题讨论】: