带行分解的R数据表转换

带行分解的R数据表转换,r,data.table,R,Data.table,当其中一列的总和打破句点时,我想将一行拆分为两行(或更多)。 是否有任何优雅的方法可以使用data.table执行这种特定的行分解? 不要关注cumsum(我使用它的顺序相反,将cumsum从最近的一行转换为最早的一行),严格地说,我希望从下面的代码将dt转换为rdt # current data dt <- data.table( time_id = 101:110, desc = c('asd','qwe','xyz','qwe','qwe','xyz','asd','asd

当其中一列的总和打破句点时,我想将一行拆分为两行(或更多)。 是否有任何优雅的方法可以使用data.table执行这种特定的行分解? 不要关注cumsum(我使用它的顺序相反,将cumsum从最近的一行转换为最早的一行),严格地说,我希望从下面的代码将dt转换为rdt

# current data
dt <- data.table(
  time_id = 101:110, 
  desc = c('asd','qwe','xyz','qwe','qwe','xyz','asd','asd','qwe','asd'),
  value = c(5.5,3.5,14,0.7,6,5.5,9.3,29.8,4,7.2)
)
dt[, cum_value_from_now := rev(cumsum(rev(value)))]
period_width <- 10
dt[, value_period := ceiling(cum_value_from_now/period_width)*period_width]
dt

# expected result
rdt <- data.table(
  time_id = c(101,102,103,103,104,105,105,106,107,107,108,108,108,108,109,109,110), 
  desc = c('asd','qwe','xyz','xyz','qwe','qwe','qwe','xyz','asd','asd','asd','asd','asd','asd','qwe','qwe','asd'),
  value = c(5.5,3.5,6.5,7.5,0.7,1.8,4.2,5.5,0.3,9,1,10,10,8.8,1.2,2.8,7.2)
)[, cum_value_from_now := rev(cumsum(rev(value)))][, value_period := ceiling(cum_value_from_now/period_width)*period_width]
rdt

# validation
all.equal(
  dt[,list(time_id,desc,value)],
  rdt[,list(value = sum(value)), by=c('time_id','desc')]
  )
#当前数据

dt首先,您似乎在不一致地应用规则。如果“中断周期”意味着一行与前一行的
value\u period
不同,则第2行中断周期,但您不这样处理

第二,你从不解释价值的划分。例如,第3行的
值为14
。这在
rdt
中被替换为两行,值分别为6.5和7.5。这些加上14行,但没有解释为什么应该是6.5和7.5,而不是7和7。所以在下面的解决方案中,我平均分配

下面的代码生成的结果通过了您的测试,但由于上述问题,它与您的
rdt
不完全相同

dt[,diff:=c(-diff(value_period)/10,0)]
rdt <- dt[,list(value=as.numeric(rep(value/(diff+1),diff+1))),
          by=list(time_id,desc,cum_value_from_now, value_period)]

all.equal(
  dt[,list(time_id,desc,value)],
  rdt[,list(value = sum(value)), by=c('time_id','desc')]
)
# [1] TRUE
dt[,diff:=c(-diff(值周期)/10,0)]

rdt你所说的“打破周期”是什么意思?请同情我们:发布一个小的、可重复的示例,只使用一个矩阵,没有
数据。表
操作,以及期望的结果。同样有用:告诉我们这个函数的要点是什么,因为可能有一种更简单的方法来实现您的最终目标。“中断周期”最好由
value\u period
变量定义。它是一种分组变量,在本例中,按
10
对cumsum进行分组。至于
matrix
示例,我已经很长时间没有使用matrix了,我记得在matrix中可能无法混合数据类型。在我的real
data.table
中,我还使用了更复杂的数据类型,因此将其转换为矩阵更加困难。关键是将适合两个(或更多)时段的行拆分为多行,这些行将聚合到源行,如验证步骤中所示。感谢您的输入。广告1,请查看我的
rdt
从现在开始的
cum\u值
从最后到第一的值。每个
value\u期间
都已完全填充,剩余的值作为新行生成,以适应下一个期间。第3行,将其拆分为6.5和7.5,以精确填充该时段。拆分为7,7将生成不填充句点的行,仍然略微超出(0.5)。在下面的广告代码中,重新计算rdt上的
cum\u value\u from\u now
,查看它是否与时段不符。我希望我的解释足够清楚,期待你的回答更新。提前谢谢