我正在尝试转换表格。我有数据框ByBatch:
Batch Time DurationHours UnitsProduced
1 2015-04-03 13:00 4 2500
2 2015-04-04 14:00 3 1500
我需要将该表转换为按小时和批处理生成的表(ByHour):
Time Batch UnitsProduced
2015-04-03 13:00 1 625
2015-04-03 14:00 1 625
2015-04-03 15:00 1 625
2015-04-03 16:00 1 625
2015-04-04 14:00 2 500
2015-04-03 15:00 2 500
2015-04-03 16:00 2 500
我正在考虑应用for循环和应用函数,但这似乎非常复杂,可能不是一个好方法。如果有人能为我提供一个很好的方法,我将不胜感激。
答案 0 :(得分:1)
一种方法是循环输入数据帧的行(此处为dat
),生成具有与该输入行对应的所需输出行的数据帧。我在这里使用lapply
进行循环,生成一个数据帧列表,每个输入行一个。剩下的就是将所有生成的数据帧组合成一个输出数据帧,我使用do.call
和rbind
。
do.call(rbind, lapply(1:nrow(dat), function(i) {
data.frame(Time = dat$Time[i] + 3600*(0:(dat$DurationHours[i]-1)),
Batch = dat$Batch[i],
UnitsProduced = dat$UnitsProduced[i] / dat$DurationHours[i])
}))
# Time Batch UnitsProduced
# 1 2015-04-03 13:00:00 1 625
# 2 2015-04-03 14:00:00 1 625
# 3 2015-04-03 15:00:00 1 625
# 4 2015-04-03 16:00:00 1 625
# 5 2015-04-04 14:00:00 2 500
# 6 2015-04-04 15:00:00 2 500
# 7 2015-04-04 16:00:00 2 500
数据:
dat = data.frame(Batch=1:2, Time=strptime(c("2015-04-03 13:00", "2015-04-04 14:00"), "%Y-%m-%d %H:%M"), DurationHours=c(4, 3), UnitsProduced=c(2500, 1500))