首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >R与点(".")、"~“和管道(%>%)运算符的组合

R与点(".")、"~“和管道(%>%)运算符的组合
EN

Stack Overflow用户
提问于 2019-02-22 04:21:04
回答 2查看 3.8K关注 0票数 9

我一直在寻找很多答案,但我仍然不能完全理解它们。例如,最清楚的一个(here),以及其他(123)给出了关于点的各种用法的具体示例,但我不能理解,例如,它在这里的应用:

car_data <- 
  mtcars %>%
  subset(hp > 100) %>%
  aggregate(. ~ cyl, data = ., FUN = . %>% mean %>% round(2)) %>%
  transform(kpl = mpg %>% multiply_by(0.4251)) %>%
  print

#result:
  cyl   mpg  disp    hp drat   wt  qsec   vs   am gear carb    kpl
1   4 25.90 108.0 111.0 3.94 2.15 17.75 1.00 1.00 4.50 2.00 11.010
2   6 19.74 183.3 122.3 3.59 3.12 17.98 0.57 0.43 3.86 3.43  8.391
3   8 15.10 353.1 209.2 3.23 4.00 16.77 0.00 0.14 3.29 3.50  6.419

上面的代码来自explanation for %>% in magrittr,我也在尝试理解管道运算符(我知道它给出了前面计算的结果,但当它在同一函数中混合.%>%时,我在aggregate代码行中迷失了方向。

所以,我不能理解上面的代码是做什么的。我有结果了(我把它放在上面了)。但是我不明白它是如何得到这个结果的,特别是在aggregate代码行中,它使用了点和~符号。我知道~的意思是“所有其他变量”,但是点是什么意思呢?它有另一种含义或用途吗?在一个特定的函数中,管道操作符是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-22 04:29:46

这行代码以三种不同的方式使用.

         [1]             [2]      [3]
aggregate(. ~ cyl, data = ., FUN = . %>% mean %>% round(2))

一般来说,使用.将值从管道传递到函数中的特定位置,但也有一些例外。一个例外是当.在公式中时。~用于在R中创建公式。管道不会更改公式的含义,因此它的行为就像没有任何转义一样。例如

aggregate(. ~ cyl, data=mydata)

这只是因为aggregate需要一个左右两边都有的公式。因此,[1]中的.只表示“数据集中的所有其他列”。这种用法与magrittr没有任何关系。

[2]处的.是作为管道传入的值。如果你有一个普通的.作为函数的参数,那么这个值就会被放置在那里。因此,subset()的结果将转到data=参数。

magrittr库还允许您使用.变量定义匿名函数。如果你有一个以.开头的链,它会被当作一个函数来处理。所以

. %>% mean %>% round(2)

等同于

function(x) round(mean(x), 2)

因此,您只需在[3]上使用.创建自定义函数

票数 15
EN

Stack Overflow用户

发布于 2019-02-22 04:44:45

由于有多个函数按顺序执行,因此可以选择使用compose

library(tidyverse)
f1 <- list(mean,  partial(round, digits = 2))
mtcars %>% 
    filter(hp > 100) %>% 
    group_by(cyl) %>% 
    summarise_all(list(~lift(compose)(f1)(.))) %>% 
    mutate(kpl = mpg * 0.4251) #multiply_by is a bit verbose
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54815607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档