首页 > 解决方案 > 在不汇总的情况下计算组中元素的出现次数

问题描述

我有如下所示的数据集:

x <- data.table(id=c(1,1,1,2,2,3,4,4,4,4), cl=c("a","b","c","b","b","a","a","b","c","a"))

我试图根据 cl 中的元素找到为每个组(id)选择一行的概率。

我尝试了以下方法:

x[,num:=.N, keyby=.(id,cl)]

x[,den:=.N, keyby=.(id)]

x[,prob:=num/den, ]

有一个更好的方法吗?

最终,我的最终目标是使用概率值作为权重,同时对每组(id)的一行进行采样。任何更好的选择来达到这些权重将不胜感激。

标签: rdata.tablecountingresamplingsummarize

解决方案


你的意思是这样的吗?

> x[, prob := prop.table(table(cl))[cl], id][]
    id cl      prob
 1:  1  a 0.3333333
 2:  1  b 0.3333333
 3:  1  c 0.3333333
 4:  2  b 1.0000000
 5:  2  b 1.0000000
 6:  3  a 1.0000000
 7:  4  a 0.5000000
 8:  4  b 0.2500000
 9:  4  c 0.2500000
10:  4  a 0.5000000

或者

> unique(x[, prob := prop.table(table(cl))[cl], id][])
   id cl      prob
1:  1  a 0.3333333
2:  1  b 0.3333333
3:  1  c 0.3333333
4:  2  b 1.0000000
5:  3  a 1.0000000
6:  4  a 0.5000000
7:  4  b 0.2500000
8:  4  c 0.2500000

解释:table+prop.table给出了所有元素的频率表,它们是命名值,因此我们用来[cl]对频率进行子集化。


推荐阅读