假设我有一个如下所示的原始数据集。作为整理过程,我尝试选择没有NA值的列-或删除具有NA-的列,引用此
raw_data
#> data_name col_a col_b
#> <chr> <int> <int>
#> 1 data_a 30 NA
#> 2 data_b 20 75
#> 3 sum 50 NA
删除NA列的代码
data_without_na <- raw_data %>% select_if(~ !any(is.na(.)))
data_without_na
输出#> data_name col_a
#> <chr> <int>
#> 1 data_a 30
#> 2 data_b 20
#> 3 sum 50
输出是我想要的,但是我很困惑为什么在条件的开始需要波浪(~)。
到目前为止我所理解的是:
- R中的波浪:将等式的左侧与右侧分开
- !:否定
- any(is.na(.)):如果存在任何na值,则每列的值为true或false
如何波浪工作没有左边的变量?
在一般情况下,使用~
等同于使用function(...)
。基本上,~
将类似公式的表达式转换为函数。见下文:
library(dplyr)
df %>%
select_if(function(x) !any(is.na(x)))
#> data_name col_a
#> 1 data_a 30
#> 2 data_b 20
#> 3 sum 50
df %>%
select_if(~ !any(is.na(.)))
#> data_name col_a
#> 1 data_a 30
#> 2 data_b 20
#> 3 sum 50
我可以试着进一步解释,但是StackOverflow上有多个线程可以更好地解释这个,所以我只参考那些:
- R中的波浪点(~.)
- dplyr中波浪和点符号的含义
数据:
df <- read.table(text = " data_name col_a col_b
data_a 30 NA
data_b 20 75
sum 50 NA", header = T)