转换后 R 管道运算符的行为

Behavior of R pipe operator after transformation

当我在其中一个步骤中应用转换时,我很难理解管道运算符的行为(|> in base 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

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

使用 magrittr 的管道,我们可以通过显式调用 * 函数来解决这个问题:

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

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

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

(但请参阅 了解解决方法。)

这只能是亲爱的 提供的非常好的解决方案的第二个替代方案,它还包含一些有趣的新功能。 我们可以使用 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 

另一种选择是转换为 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