Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么日志应用于带有magrittr管道的向量会产生意外的&;不正确的值?_R_Magrittr - Fatal编程技术网

为什么日志应用于带有magrittr管道的向量会产生意外的&;不正确的值?

为什么日志应用于带有magrittr管道的向量会产生意外的&;不正确的值?,r,magrittr,R,Magrittr,我试图计算离散分布的熵,我注意到使用magrittr的行为并不是我所期望的。举个例子: > x <- c("A","B","C","A","A","D") > table(x)/length(x) %>% log2

我试图计算离散分布的熵,我注意到使用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
>x表(x)/长度(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
>freq log2(freq)
x
A、B、C、D
-1.000000 -2.584963 -2.584963 -2.584963

这可能有效,一定是许多管道的风扇:)

magrittr
还提供除法、乘法等。您也可以跳过包,使用以下语法

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

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

您所做的等效于
table(x)/log2(length(x))
我猜
length(x)%%>%log2
首先被计算,然后在除法运算中使用。请参见
?语法
。像
%>%
这样的特殊操作员比
/
具有更高的优先级。他们应该停止小学教学,开始教授BPodma。括号、管道操作员、订单等(表(x)/长度(x))%%>%log2(.)我不同意,管道恰好由
dplyr
使用,但它在任何地方都是有效的。这是一个公平的观点,@Axeman。我相应地改写了我的答案。谁说装配工死了?
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