带行分解的R数据表转换
当其中一列的总和打破句点时,我想将一行拆分为两行(或更多)。 是否有任何优雅的方法可以使用data.table执行这种特定的行分解? 不要关注cumsum(我使用它的顺序相反,将cumsum从最近的一行转换为最早的一行),严格地说,我希望从下面的代码将dt转换为rdt带行分解的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
# 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中可能无法混合数据类型。在我的realdata.table
中,我还使用了更复杂的数据类型,因此将其转换为矩阵更加困难。关键是将适合两个(或更多)时段的行拆分为多行,这些行将聚合到源行,如验证步骤中所示。感谢您的输入。广告1,请查看我的rdt
从现在开始的cum\u值
从最后到第一的值。每个value\u期间
都已完全填充,剩余的值作为新行生成,以适应下一个期间。第3行,将其拆分为6.5和7.5,以精确填充该时段。拆分为7,7将生成不填充句点的行,仍然略微超出(0.5)。在下面的广告代码中,重新计算rdt上的cum\u value\u from\u now
,查看它是否与时段不符。我希望我的解释足够清楚,期待你的回答更新。提前谢谢