【问题标题】:Calculating ratio of values with specific labels in data.table计算 data.table 中具有特定标签的值的比率
【发布时间】:2013-08-20 10:48:54
【问题描述】:

我有一个data.table,我需要添加额外的列,该列是相同 cID 的标签 == 1 和标签 == 2 之间的比率。我有可以做到这一点的代码,但结果是根据唯一“l”的数量减少的形式。但我需要一个包含重复项的完整列表。有什么建议?提前致谢!

x   y   l   cID
0.03588851  0.081635056 1   1
0.952514891 0.82677373  1   1
0.722920691 0.687278396 1   1
0.772207687 0.743329599 2   1
0.682710551 0.946685728 1   2
0.795816439 0.024320077 2   2
0.50788885  0.106910923 2   2
0.145871035 0.802771467 2   2
0.092942384 0.335054397 1   3
0.439765866 0.199329139 1   4

复制

x = c(0.03588851,0.952514891,0.722920691,0.772207687,0.682710551,0.795816439,0.50788885,0.145871035,0.092942384,0.439765866)
y = c(0.081635056,0.82677373,0.687278396,0.743329599,0.946685728,0.024320077,0.106910923,0.802771467,0.335054397,0.199329139)
l = c(1,1,1,2,1,2,2,2,1,1)
cID = c(1,1,1,1,2,2,2,2,3,4)
dt <- data.table(x,y,l,cID)
dt[,sum(l == 1)/sum(l == 2), by = cID]

我需要获取如下所示的比率列

x   y   l   cID ratio
0.03588851  0.081635056 1   1   3
0.952514891 0.82677373  1   1   3
0.722920691 0.687278396 1   1   3
0.772207687 0.743329599 2   1   3
0.682710551 0.946685728 1   2   0.333333333
0.795816439 0.024320077 2   2   0.333333333
0.50788885  0.106910923 2   2   0.333333333
0.145871035 0.802771467 2   2   0.333333333
0.092942384 0.335054397 1   3   Inf
0.439765866 0.199329139 1   4   Inf

【问题讨论】:

    标签: r data.table conditional-statements


    【解决方案1】:

    你已经很接近了。试试这个:

    dt[, ratio := sum(l == 1) / sum(l == 2), by = cID]
    

    【讨论】:

    • 它不使用数据的顺序。它只是总和的比率。
    • @JohnAmraph 如果您的意思是如果这些组不在一起但混在一起,它还会起作用吗?是的。在这种情况下,您可以认为每个组都被复制到一个连续的块中,例如 sum 或依赖顺序的 cumsum 在其上运行,然后将结果放回组最初所在的行上。如果这有意义的话。
    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2022-08-23
    相关资源
    最近更新 更多