1

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

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

但是,我想要做的是将总人口数除以每组中另一列的行数 。像这样的东西:

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

这里的重点是geoid id6id7是 的子区域ct E1010,因此 和 的人口id6应该id7E1010它们所在的较大区域的人口比例相等。

预期结果

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

>    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'))
4

1 回答 1

3

一种方法是预先计算相应的大小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
于 2015-10-27T10:32:27.500 回答