根据其他列的 nrows 按组汇总数据表

Summarize datatable by group based on nrows of other column

我知道下面的这个命令将通过按组添加人口并将其除以每组的行数来总结我的 table。

dt[, .(pop=sum(pop_ct)/sum(.N)), , by=.(geoid)]

然而,我想要做的是将总人口数减去另一列每组的行数 .像这样:

dt[, .(pop=sum(pop_ct)/ nrow(dt$geoid) ), , by=.(geoid)]

这里的重点是 geoid id6id7ct E1010 的子区域,因此 id6 的人口并且 id7 应该与他们所在的较大区域 E1010 的人口比例相等。

预期结果

使用下面的可重现示例,这是我想要得到的结果:

>    geoid pop
> 1:   id1  47
> 2:   id2  35
> 3:   id3  10
> 4:   id5  30
> 5:   id4  10
> 6:   id6  10
> 7:   id7  10

可重现的例子

dt <- data.table(
  udh = LETTERS[c(1,1,1,1,2,2,3,3,3,4,5,5)],
  ct = c('A000','A111','A222','A333','B444','B555','C666','C777','C888','D999','E1010','E1010'),
  pop_udh = c(40,40,40,40,30,30,45,45,45,17,20,20),
  pop_ct = c(20,10,8,2,25,5,5,30,10,17,20,20),
  poor_prop_udh = c(10,10,10,10,5,5,8,8,8,7,9,9),
  geoid = c('id1','id2','id2','id1','id1','id3','id3','id5','id4','id2','id6','id7'))

一种方法是预先计算 ct 的大小并相应地划分,例如

dt[, N := .N, by = ct
   ][, .(pop = sum(pop_ct)/N[1L]), by = geoid]
#    geoid pop
# 1:   id1  47
# 2:   id2  35
# 3:   id3  10
# 4:   id5  30
# 5:   id4  10
# 6:   id6  10
# 7:   id7  10