我有一个如下所示的数据集:
job_id start_hour duration
1 14 3
2 8 2
Job_id:作业的ID
start_hour:作业开始的小时
持续时间:工作所需的小时数
我想把它变成一张表,每行代表一小时的工作:
job_id hour
1 14
1 15
1 16
2 8
2 9
所以我会为每份工作提供尽可能多的工作时间。
在R中有优雅的方法吗?
非常感谢
答案 0 :(得分:3)
执行此操作的一种方法是使用包plyr
(其中d
是您的原始数据框)
ddply(d, .(job_id),
function(d) data.frame(job_id = d$job_id,
hour = d$start_hour:(d$start_hour + d$duration -1)))
答案 1 :(得分:2)
这也可以通过简单的基本功能实现。首先,输入data.frame
#sample data
dd<-data.frame(
job_id = 1:2,
start_hour = c(14, 8),
duration = c(3, 2)
)
现在我们使用Map
遍历每一行并将其展开到正确的大小。然后我们将所有新扩展的行合并到一个带有do.call(rbind,...)
#transformation
do.call(rbind,Map(function(id,start,dur) {
data.frame(
job_id=rep(id, dur),
hour=seq(from=start, by=1, length.out=dur))
}, dd$job_id, dd$start_hour, dd$duration))
给了我们
job_id hour
1 1 14
2 1 15
3 1 16
4 2 8
5 2 9