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