【问题标题】:What is the meaning of the `~` operator in the tidyverse context?tidyverse 上下文中的 `~` 运算符是什么意思?
【发布时间】:2020-05-19 01:48:30
【问题描述】:

假设数据集如下:

df_1 <- structure(list(var_1 = c(42.0324095338583, 86.828490421176, 42.4499513395131, 
87.8373390808702, 69.4962524808943), var_2 = c(52.6775231584907, 
60.7429852150381, 23.1536079756916, 89.0404256992042, 40.8967914432287
), var_3 = c(53.2254045270383, 99.7671523876488, 55.2181884087622, 
97.3904117196798, 63.9911676943302), var_4 = c(77.9183112829924, 
53.8156733289361, 71.4701929315925, 70.3330857120454, 24.3069419451058
), var_5 = c(48.498358130455, 86.109549254179, 45.0998894125223, 
61.7115858010948, 39.3580442667007), var_6 = c(43.4050587192178, 
32.7955435216427, 46.6158176586032, 43.4641770273447, 49.2192720063031
), groups = structure(c(1L, 2L, 2L, 2L, 2L), .Label = c("1", 
"2", "3"), class = "factor")), row.names = c(NA, 5L), class = "data.frame")

还有以下功能:

library(tidyverse)
library(magrittr)

df_1 %>% 
  filter(
    across(.cols = is.numeric, .fns = ~ is_weakly_greater_than(e1 = ., e2 = 40))
  )

#     var_1    var_2    var_3    var_4    var_5    var_6 groups
#1 42.03241 52.67752 53.22540 77.91831 48.49836 43.40506      1
#2 87.83734 89.04043 97.39041 70.33309 61.71159 43.46418      2

正常工作。但是,只需删除 ~ 运算符:

df_1 %>% 
  filter(
    across(.cols = is.numeric, .fns = is_weakly_greater_than(e1 = ., e2 = 40))
  )

错误:across() 只能在 dplyr 动词中使用。

  • tidyverse 代码中使用~ 运算符是什么意思?

【问题讨论】:

  • 这是一个廉价的 lambda/匿名函数,其中 . 是它的单数参数。将~ mean(.) 视为function(a) mean(a)。 (它可能比这更强大,但这通常是正确的。)
  • @r2evans 您能否添加更多详细信息的答案?谢谢。

标签: r tidyverse


【解决方案1】:

最常见的是,它是编写匿名函数的一种简写方式。

map_dbl(HEIGHT, ~ sum(.x, 5))

一样
map_dbl(HEIGHT, function(.x){sum(.x, 5))

它在其他上下文中具有其他含义。例如,在R&gt; 提示符下,键入

? case_when 

看看它如何使用~

【讨论】:

    【解决方案2】:

    您可以通过多种方式在dplyr 动词中应用函数。

    按原样使用函数:

    library(dplyr)
    mtcars %>% mutate_if(is.numeric, sqrt)
    

    使用公式接口即~

    mtcars %>% mutate_if(is.numeric, ~sqrt(.))
    

    使用匿名函数 -

    mtcars %>% mutate_if(is.numeric, function(x) sqrt(x))
    

    当你使用~时,你是在通知你要使用函数的公式接口。

    显然,sqrt 只是一个示例,您可以使用它来应用更复杂的功能。

    【讨论】:

    • 还有列表
    • 我猜这和使用公式语法一样。
    猜你喜欢
    • 2013-10-14
    • 2013-05-07
    • 2015-09-18
    • 2017-03-29
    • 2011-03-16
    • 2011-07-09
    • 2016-07-23
    • 1970-01-01
    相关资源
    最近更新 更多