数据表:向所有组添加观察值并分配取决于其他行的值
datatable: add observations to all groups and assign value that depends on other rows
假设我们有一个 data.table,id 和子组如下:
DT <- data.table(id=c("A","A","B","B"), subgroup=c("k","m","k","m"), C=c(4,9,6,5))
> DT
id subgroup C
1: A k 4
2: A m 9
3: B k 6
4: B m 5
现在我们要为每个id引入新的子组,其值C依赖于另一个子组。在此示例中,对于给定的 id,new 子组 l 应该是子组 k 的 0.5:
id subgroup C
1: A k 4
2: A l 2
3: A m 9
4: B k 6
5: B l 3
6: B m 5
如何使用 data.table 有效地实现这一目标?我想出的唯一解决方案是重塑宽度,然后创建新的列;但是如果有一大组 ID,这将相当笨拙。
注意:在实际应用中,会有更多的子组和 ID。
已更新以考虑具有超过 2 个子组的复杂情况
你可以这样做:
# add a new row in each group based on given condition
DT <- rbind(DT, DT[,.SD,id][,`:=`(subgroup = 'l', C = C/2)])
# order the data by id
DT <- DT[order(id)]
@Frank 建议的替代格式:
DT[, rbind(.SD, copy(.SD)[,`:=`(subgroup = 'l', C = C/2)])]
setorder(res, id)
假设我们有一个 data.table,id 和子组如下:
DT <- data.table(id=c("A","A","B","B"), subgroup=c("k","m","k","m"), C=c(4,9,6,5))
> DT
id subgroup C
1: A k 4
2: A m 9
3: B k 6
4: B m 5
现在我们要为每个id引入新的子组,其值C依赖于另一个子组。在此示例中,对于给定的 id,new 子组 l 应该是子组 k 的 0.5:
id subgroup C
1: A k 4
2: A l 2
3: A m 9
4: B k 6
5: B l 3
6: B m 5
如何使用 data.table 有效地实现这一目标?我想出的唯一解决方案是重塑宽度,然后创建新的列;但是如果有一大组 ID,这将相当笨拙。
注意:在实际应用中,会有更多的子组和 ID。
已更新以考虑具有超过 2 个子组的复杂情况
你可以这样做:
# add a new row in each group based on given condition
DT <- rbind(DT, DT[,.SD,id][,`:=`(subgroup = 'l', C = C/2)])
# order the data by id
DT <- DT[order(id)]
@Frank 建议的替代格式:
DT[, rbind(.SD, copy(.SD)[,`:=`(subgroup = 'l', C = C/2)])]
setorder(res, id)