为什么将log应用于带有magrittr管道的向量会产生意外的&错误的值?

时间:2017-07-27 11:59:46

标签: 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

2 个答案:

答案 0 :(得分:2)

这可行,必须是许多管道的粉丝:))

library(magrittr)
x %>% table %>% divide_by(x %>% length) %>% log2

magrittr也提供divide_by,multiply_by等。您也可以跳过包并使用以下语法

x %>% table %>% `/`(x %>% length) %>% log2

答案 1 :(得分:0)

如果您在使用管道时遇到问题,使用核心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