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

如何用dplyr合并操作:排除date列并删除指定列全为NA的行

用dplyr合并筛选列与删除全NA行的操作

问题背景

现有如下R数据框df:

df <- data.frame(
  date = c("2018-01-15", "2018-01-31", "2018-01-15", "2018-02-28", "2018-03-15", "2018-03-31"),
  `CPI:YoY` = c(NA, 1.2, NA, 0.9, NA, 1.0),
  `PPI:MoM` = c(NA, 0.2, NA, -0.1, NA, 0.3),
  stringsAsFactors = FALSE
)

需要用dplyr完成两步操作的合并:

  1. 筛选出名称不含date的列
  2. 删除这些列中所有值均为NA的行(保留date列)

注:实际数据列数多且date列位置不固定,无法直接指定列名,必须通过排除date列来筛选目标列。

解决方案

方法1:使用filter_at(兼容旧版dplyr)

library(dplyr)

df_cleaned <- df %>%
  filter_at(vars(-contains("date")), all_vars(!is.na(.)))
  • vars(-contains("date")):选择所有名称不含date的列
  • all_vars(!is.na(.)):要求选中的每一列对应行的值都不为NA,即删除非date列全为NA的行

方法2:使用across(dplyr 1.0.0+推荐)

library(dplyr)

df_cleaned <- df %>%
  filter(across(-contains("date"), ~!is.na(.x)))

across是dplyr 1.0.0版本后引入的函数,更简洁直观,作用是对指定列执行同一逻辑检查。

预期结果

执行上述代码后,得到的df_cleaned为:

date CPI:YoY PPI:MoM
1 2018-01-31     1.2     0.2
2 2018-02-28     0.9    -0.1
3 2018-03-31     1.0     0.3

内容的提问来源于stack exchange,提问作者ah bon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:24:51