【问题标题】:Behavior of R pipe operator after transformation转换后 R 管道运算符的行为
【发布时间】:2021-08-23 04:54:41
【问题描述】:

当我在其中一个步骤中应用转换时,我很难理解管道运算符的行为(基础 R 中的 |>,但我对 magrittr 的 %>% 也有同样的问题:

table(iris$Species) |> prop.table() |> round(1)

    setosa versicolor  virginica 
       0.3        0.3        0.3 



table(iris$Species) |> prop.table()*100 |> round(1)

    setosa versicolor  virginica 
  33.33333   33.33333   33.33333  

为什么第二个命令没有将结果传递给round

【问题讨论】:

    标签: r pipe


    【解决方案1】:

    这只能是亲爱的@ktiu 提供的非常好的解决方案的第二种选择,它还包含一些有趣的新功能。 我们可以使用 magrittr 包中的 multiply_by 函数,它可以与原生管道和 magrittr 管道一起使用:

    library(magrittr)
    
    table(iris$Species) |> prop.table() |> multiply_by(100) |> round(digits = 1)
    
        setosa versicolor  virginica 
          33.3       33.3       33.3 
    

    【讨论】:

      【解决方案2】:

      在您的示例中,只有 100 被传递给 round() - 所以它不会影响任何事情,因为 100 已经是一个整数。 %>% 也会发生同样的事情。

      使用magrittr 的管道,我们可以通过使用反引号将* 作为函数显式调用来解决此问题:

      table(iris$Species) %>% prop.table() %>% `*`(100) %>% round(1)
      

      在基础 R 中,AFAIK 我们必须包含一个匿名函数来进行乘法:

      table(iris$Species) |> prop.table() |> (\(x) x * 100)() |> round(1)
      

      (但请参阅Anoushiravan R's answer 了解解决方法。)

      【讨论】:

      • 对匿名函数的如此有趣的解释。请您为我解释一下,因为我以前从未见过这种形式的语法?我真的很感激。
      • 此语法是在 R 4.1 中与本机管道一起引入的。 \(x)function(x) 的同义词,我认为它应该看起来像一个 lambda :)
      • 太棒了。谢谢 有没有我可以阅读的文档?
      • This 是一个很好的介绍。
      • 感激不尽。非常感谢。
      【解决方案3】:

      另一种选择是转换为data.frame 并使用transform

      table(iris$Species) |> 
           prop.table() |> 
           as.data.frame() |>
           transform(Freq = round(Freq * 100, 1))
      

      -输出

              Var1 Freq
      1     setosa 33.3
      2 versicolor 33.3
      3  virginica 33.3
      

      【讨论】:

        猜你喜欢
        • 2022-06-29
        • 1970-01-01
        • 2019-07-15
        • 2016-12-25
        • 1970-01-01
        • 2014-04-03
        • 1970-01-01
        • 1970-01-01
        • 2014-09-18
        相关资源
        最近更新 更多