根据其他列的 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
id6
和 id7
是 ct
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
我知道下面的这个命令将通过按组添加人口并将其除以每组的行数来总结我的 table。
dt[, .(pop=sum(pop_ct)/sum(.N)), , by=.(geoid)]
然而,我想要做的是将总人口数减去另一列每组的行数 .像这样:
dt[, .(pop=sum(pop_ct)/ nrow(dt$geoid) ), , by=.(geoid)]
这里的重点是 geoid
id6
和 id7
是 ct
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