假设我有一个数据框 df
如下:
date CPI:YoY PPI:MoM
1 2018-01-15 NA NA
2 2018-01-31 1.2 0.2
3 2018-01-15 NA NA
4 2018-02-28 0.9 -0.1
5 2018-03-15 NA NA
6 2018-03-31 1.0 0.3
我需要使用 dplyr
实现以下两个步骤:选择不包含 date
的列,然后删除这些列中所有值为 NA
的行s。
选择不包含 date
的列可以通过代码实现:dplyr::select(grep("date", names(df)))
或dplyr::select(contains("date", ignore.case = TRUE))
;要删除所选列中的 NA 行,我们可以使用:filter_at(vars(cols), all_vars(!is.na(.)))
或dplyr::drop_na(cols)
.
现在我的问题是如何将两个代码合并为一个?谢谢。
注意:对于此示例,我们可以简单地使用 drop_na(CPI:YoY, PPI:MoM)
得到预期的结果,但是由于在实际数据中,我们通常有很多列,并且 date
的位置列不必始终是第一列,因此我更愿意通过排除 date
来对列进行子集化专栏。
预期结果:
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
引用文献:
Subset data to contain only columns whose names match a condition
最佳答案
您可以使用过滤器
+ if_any/if_all
:
df %>%
filter( !if_all(-contains("date"), is.na) )
df %>%
filter( if_any(-contains("date"), ~ !is.na(.)) )
df %>%
filter( if_any(-contains("date"), Negate(is.na)) )
注意:取反(is.na)
= function(x) !is.na(x)
= ~ !is.na( .)
输出
date CPI:YoY PPI:MoM
2 2018-01-31 1.2 0.2
4 2018-02-28 0.9 -0.1
6 2018-03-31 1.0 0.3
数据
df <- read.table(text =
" date CPI:YoY PPI:MoM
1 2018-01-15 NA NA
2 2018-01-31 1.2 0.2
3 2018-01-15 NA NA
4 2018-02-28 0.9 -0.1
5 2018-03-15 NA NA
6 2018-03-31 1.0 0.3", check.names = FALSE)
关于r - 排除列名包含特定字符的列,并删除剩余列中包含 NA 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73536941/