r语言 - dplyr条件选择中的波浪号(~)函数



假设我有一个如下所示的原始数据集。作为整理过程,我尝试选择没有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上有多个线程可以更好地解释这个,所以我只参考那些:

  1. R中的波浪点(~.)
  2. dplyr中波浪和点符号的含义

数据:

df <- read.table(text = " data_name col_a  col_b
data_a     30    NA
data_b     20    75
sum        50    NA", header = T)

最新更新