数据表:向所有组添加观察值并分配取决于其他行的值

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)