繁体   English   中英

如何聚合数据集并计算 R 中跨组的连续变量的熵?

[英]How can I aggregate a data set and calculate entropy of a continuous variable across groups in R?

我想计算 R 中每个组的连续变量的熵。

以下是数据示例:

id group X 1 1 1 28 2 2 1 45 3 3 2 21 4 4 2 46 5 5 3 82 6 6 3 98

实际上有 273 个组和 X 以外的更多变量。

我希望能够为每个“组”计算 X 的熵。

我曾尝试在 tidyr 中使用 group_by 和 summarize 命令,但我认为没有合适的熵命令。

希望有一个简单的解决方案。

提前致谢。

R 中有一个entropy package。

#install.packages('entropy')
library(entropy)

df %>% 
  group_by(group) %>% 
  mutate(entropy = entropy(X))

给我们:

     id group     X entropy
  <dbl> <dbl> <dbl>   <dbl>
1     1     1    28   0.666
2     2     1    45   0.666
3     3     2    21   0.622
4     4     2    46   0.622
5     5     3    82   0.689
6     6     3    98   0.689

或者对于汇总结果:

df %>% 
  group_by(group) %>% 
  summarize(entropy = entropy(X))

给我们:

  group entropy
  <dbl>   <dbl>
1     1   0.666
2     2   0.622
3     3   0.689

数据:

df <- structure(list(id = c(1, 2, 3, 4, 5, 6), group = c(1, 1, 2, 2, 
3, 3), X = c(28, 45, 21, 46, 82, 98)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

在基数 R 中,您可以将熵 function 写在外面,而不是每次都重新定义它。 IE

  entropy_base <- function(x) -sum((x<-prop.table(x))*log(x))

如果你想总结:

aggregate(X~group,df, entropy_base)
  group         X
1     1 0.6657808
2     2 0.6218199
3     3 0.6891913

如果你想变异:

transform(df,entopy=ave(X,group,FUN = entropy_base))
  id group  X    entopy
1  1     1 28 0.6657808
2  2     1 45 0.6657808
3  3     2 21 0.6218199
4  4     2 46 0.6218199
5  5     3 82 0.6891913
6  6     3 98 0.6891913

我会在 plyr package 中推荐 ddply function: https://www.rdocumentation.org/packages/plyr/versions/1.8.6/topics/ddply

这个 function 允许你传递数据,列来分组,并应用一个 function。

例子:

ddply(data, .(Group), summarise, Entropy(x,Y))

在我有 Entropy(x,Y) 的地方,您可以包含您想要的任何熵 function。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM