如何使用dplyr仅对指定行移除特定列全为NA的记录?
仅过滤指定行(最后一行)中特定列全为NA的记录
原始数据
x <- data.frame("Y" = 2000:2010, "A" = c(0, NA, 1, 1, 0, 1, NA, NA, 1, 0, NA), "B" = c(0, 0, NA, 1, 1, 0, NA, NA, 0, 1, NA))
现有实现(移除所有A、B列全为NA的行)
x |> dplyr::filter(if_any(c("A", "B"), ~ !is.na(.x)))
运行结果:
Y A B 1 2000 0 0 2 2001 NA 0 3 2002 1 NA 4 2003 1 1 5 2004 0 1 6 2005 1 0 7 2008 1 0 8 2009 0 1
需求
仅对最后一行应用上述过滤规则(移除最后一行中A、B全为NA的记录),保留其他行中A、B全为NA的记录(如Y=2006和Y=2007的行),期望结果如下:
Y A B 1 2000 0 0 2 2001 NA 0 3 2002 1 NA 4 2003 1 1 5 2004 0 1 6 2005 1 0 7 2006 NA NA 8 2007 NA NA 9 2008 1 0 10 2009 0 1
解决方案
通过row_number()标记行号,结合逻辑条件实现:
x |> dplyr::filter(row_number() != nrow(x) | if_any(c("A", "B"), ~ !is.na(.x)))
也可以用if_all反向判断:
x |> dplyr::filter(!(row_number() == nrow(x) & if_all(c("A", "B"), is.na)))
逻辑说明
- 非最后一行:直接保留,不受A、B列是否全为NA的限制
- 最后一行:仅当A或B列至少有一个非NA值时才保留,否则移除
运行上述代码后,即可得到符合期望的结果。
内容的提问来源于stack exchange,提问作者dimfalk
相关产品推荐
相关产品推荐

