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