计算组中某个元素的出现次数而不进行汇总

Count the occurence of an element in the group without summarizing

我有这样的数据集:

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) 的一行进行采样时使用概率值作为权重。如果有任何更好的替代方法来达到这些权重,我们将不胜感激。

你的意思是这样的吗?

> 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给出了所有元素的频率table,这是命名值,因此我们使用[cl]对频率进行子集化。

如果您的目的是根据观察到的频率生成随机样本:

x[, .N , by= .(id, cl)][, prop := N/sum(N), by = .(id)][]
#    id cl N      prop
# 1:  1  a 1 0.3333333
# 2:  1  b 1 0.3333333
# 3:  1  c 1 0.3333333
# 4:  2  b 2 1.0000000
# 5:  3  a 1 1.0000000
# 6:  4  a 2 0.5000000
# 7:  4  b 1 0.2500000
# 8:  4  c 1 0.2500000