【发布时间】:2022-01-17 06:15:21
【问题描述】:
我有非排他性类别/分类的流行数据。 (例如,一个故事可以是“惊人的”、“无聊的”、“迷人的”、“黑暗的”或这四者的任意组合。)说明性:
library(data.table)
set.seed(0)
results = as.data.table( expand.grid( rep( list(0:1) , 4 ) ) )
names(results) = c('a', 'b', 'c', 'd')
results$prevalence = runif( n = 16 )
results$prevalence = results$prevalence/sum(results$prevalence)
我希望能够回答以下问题:
- (琐碎)不属于任何类别(
a = b = c = d = 0)的人口覆盖率是多少? - 哪一类人群覆盖率最高?
- 哪两个类别覆盖了最大的人口百分比?
- ...等等...
实际上,我想创建一个准 CDF,其中:
- 我知道对于无类别的数据(即
a = b = c = d = 0),我覆盖了 10% 的人口。 - 我知道,对于一个类别或没有类别的数据,我可以通过将自己限制为
c类别来覆盖 21% 的人口。
即:
results[ ( a == 0 & b == 0 & d == 0 ) & rowSums( results[ , -'prevalence' ] ) <= 1 , sum(prevalence) ]
- 我知道,对于两个、一个或没有类别的数据,我可以通过将自己限制为
b和c类别来覆盖 36% 的人口。
即:
results[ ( a == 0 & d == 0 ) & rowSums( results[ , -'prevalence' ] ) <= 2 , sum(prevalence) ]
- 我知道,对于三个、两个、一个或没有类别的数据,我可以通过将自己限制为
a、b和c类别来覆盖 59% 的人口。
即:
results[ ( d == 0 ) & rowSums( results[ , -'prevalence' ] ) <= 3 , sum(prevalence) ]
- 而且,我知道,对于四个、三个、两个、一个或没有类别的数据,我可以通过将自己限制在四个类别中的每一个类别(
a、@987654334 @、c、d)。
在这个有限的例子中,我只是检查了所有可能的类别,通过对允许的非零类别进行分组来找到最大的流行度(实际上,正如你在我的代码 sn-ps 中看到的那样,我正在做相反的事情并通过分组来找到流行度限制为零的类别)。
我怎样才能以data.table 的方式做到这一点,这样我就不必在我的真实摘要数据集中通过许多虚拟变量(列)组合进行暴力破解?
我怀疑这可能涉及对.EACHI 或lapply 的巧妙使用,这是我无法想到的。
【问题讨论】:
标签: r statistics data.table