如何用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完成两步操作的合并:
- 筛选出名称不含
date的列 - 删除这些列中所有值均为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
相关产品推荐
相关产品推荐

