2017-05-28 65 views
0

我有一个data.table days_dt如何通过天计算每周小时data.table R中

days_dt <- data.table(day = c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")) 

它看起来像

days_dt 
day 
1: Monday 
2: Tuesday 
3: Wednesday 
4: Thursday 
5: Friday 
6: Saturday 
7: Sunday 

我还有一个单独的记录data.table其中我要和时间的每一天:

> weighted_average_time 
    mon_from_time mon_to_time tue_from_time tue_to_time wed_from_time wed_to_time thu_from_time 
1  7.965174 21.39378  7.965174 21.39378  7.965174 21.39378  7.965174 
    thu_to_time fri_from_time fri_to_time sat_from_time sat_to_time sun_from_time sun_to_time 
1 21.39876  7.965174 21.39876  7.942786 21.35149  9.766915 16.91617 

我想找到的日常高度差(在新列)和定时在FI第一个表days_dt。例如周一(21.39378 - 7.965174 = 13.42861)

如何使用data.table做到这一点R中

预期的输出必须看起来像

days_dt 
day  time_diff 
Monday 13.42861 
.  . 
.  . 
and so on for all the days 
+0

增加的预期输出有问题 –

回答

1

我们melt第二数据集long格式,按'变量'的子字符串进行分组,即只有'mon','tue'等,得到'value'列的差异,并加入on与创建分组列的原始数据集。substr

days_dt[, grp := tolower(substr(day, 1, 3))][] 
days_dt[ melt(setDT(weighted_average_time))[, diff(value) , 
    .(grp = sub("_.*", "", variable))], time_diff := V1, on = 'grp'] 
days_dt[, grp := NULL][] 
#  day time_diff 
#1: Monday 13.428606 
#2: Tuesday 13.428606 
#3: Wednesday 13.428606 
#4: Thursday 13.433586 
#5: Friday 13.433586 
#6: Saturday 13.408704 
#7: Sunday 7.149255 
+1

由于它的工作 –