[英]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.