You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:13:25