正在计算匹配的数据共享.帧行对

  • 本文关键字:数据共享 计算 r
  • 更新时间 :
  • 英文 :


我有一个包含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

最新更新