我有一个包含id变量和其他几个变量的数据集,类似于以下内容:
mydata <- tibble::tribble(
~idvar, ~age,
1, 18,
1, 18,
2, 27,
3, 89,
4, 89,
5, 12,
1, 17,
2, 27,
2, 28,
3, 41
)
对于idvar
的每个值,我想计算一对行之间的idvar
相同,年龄也相同的速率。换句话说,我想知道:
PR(age match | id match)
例如,有三行具有idvar == 1
,它们形成三对行。对于其中一对,年龄也匹配。所以我们会返回.333作为idvar == 1
。
期望输出:
1 .333
2 .333
3 0
4 NA
5 NA
您可以从基本R使用table
。从?base::table
:的手册
table
使用交叉分类因子来构建每个因子级别组合的计数的列联表。
换句话说,我们可以使用它来计算age
的每个唯一值的条目数。当计数大于1时,我们知道age
中的某个地方有匹配(或重复值(。
table(mydata$age)
12 17 18 27 28 41 89
1 1 2 2 1 1 2
对于您给定的示例,我们不会同时对所有age
执行此操作。相反,我们需要先按idvar
分组。
此外,我们需要使用table(age)
的每个元素上的二项式系数来确定可能有多少对,然后将它们相加,得到分子中的对总数。在R中,choose(n,k)
函数是二项式系数。分母仅为choose(.N, 2)
(在data.table
中,.N
是当前组中的行数(,这是该组的所有可能对的数量。
综合起来:
library(data.table)
setDT(mydata)
# Helper function
count_pairs <- function(x) {
if (length(x) > 1) { # if more than 1 row
if (length(table(x)[table(x) > 1]) > 0) { # if there is at least 1 match
sum(sapply(table(x)[table(x) > 1], function(z) choose(z, 2)))
} else {
0 # no matches
}
} else {
NA_real_ # only 1 row
}
}
mydata[, count_pairs(age) / choose(.N, 2), by = idvar]
idvar V1
1: 1 0.3333333
2: 2 0.3333333
3: 3 0.0000000
4: 4 NA
5: 5 NA