r语言 - 为什么应用于带有 magrittr 管道的向量的对数会给出意外和不正确的值?



我正在尝试计算离散分布的熵,我注意到使用 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动词(selectmutatefilter等(会有所帮助,以使您尝试执行的操作更加明显。

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

相关内容

最新更新