【问题标题】:Count the occurence of an element in the group without summarizing在不汇总的情况下计算组中元素的出现次数
【发布时间】:2021-07-05 08:22:29
【问题描述】:

我的数据集如下所示:

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) 的一行进行采样。任何更好的替代方法来达到这些权重将不胜感激。

【问题讨论】:

    标签: r data.table counting resampling summarize


    【解决方案1】:

    你的意思是这样的吗?

    > 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] 来对频率进行子集化。

    【讨论】:

    • 谢谢,这正是我要找的。我不知道这些功能的用途。如果您添加一些描述会很棒
    • @K_D 是的,我在代码中添加了一些 cmets。
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2018-02-07
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多