我正在尝试计算离散分布的熵,我注意到使用 magrittr 的行为不是我所期望的。举个例子:
> x <- c("A","B","C","A","A","D")
> table(x)/length(x) %>% log2
x
A B C D
1.1605584 0.3868528 0.3868528 0.3868528
这是不正确的---小于 1 的值的对数应该是负数。如果我分解这些步骤,我会得到正确的答案:
> freq <- table(x)/length(x)
> log2(freq)
x
A B C D
-1.000000 -2.584963 -2.584963 -2.584963
这可以工作,一定是许多管道的粉丝:)
library(magrittr)
x %>% table %>% divide_by(x %>% length) %>% log2
magrittr
还提供divide_by、multiply_by等。您也可以跳过包并使用以下语法
x %>% table %>% `/`(x %>% length) %>% log2
如果您在使用管道时遇到问题,使用核心dplyr
动词(select
、mutate
、filter
等(会有所帮助,以使您尝试执行的操作更加明显。
library(tidyverse)
x %>%
tbl_df() %>% # Convert to a tibble
group_by(value) %>%
summarise(n=n()) %>%
mutate(freq = n / sum(n)) %>% # Calculate frequency
mutate(log = log2(freq)) # Here's log2