假设我有数据帧df1
Home.ID Timeframe_Start Timeframe_End
2 58960 1476748800 1477353600
4 56862 1474329600 1474934400
6 40482 1454284800 1454889600
8 52105 1476748800 1477353600
10 37244 1476748800 1477353600
12 58213 1476748800 1477353600
14 17734 1458000000 1458604800
16 39786 1458000000 1458604800
18 42613 1458000000 1458604800
然后我有第二个数据帧df2包含相同的home_id,但它有很多不同的实例(这里只显示了它的一部分)
home_id property_name timestamp_millis value
1 58960 inside_temperature 1.475849e+12 18.510000
2 58960 inside_temperature 1.475850e+12 19.810000
3 58960 inside_temperature 1.475850e+12 19.630000
4 58960 inside_temperature 1.475850e+12 19.470000
5 58960 inside_temperature 1.475850e+12 19.300000
6 58960 inside_temperature 1.475851e+12 19.470000
2482 58960 boiler_output_temperature 1.476755e+12 55.000000
2483 58960 boiler_output_temperature 1.476755e+12 53.000000
2484 58960 boiler_output_temperature 1.476755e+12 51.000000
2485 58960 boiler_output_temperature 1.476755e+12 47.000000
2486 58960 boiler_output_temperature 1.476755e+12 46.000000
2487 58960 boiler_output_temperature 1.476756e+12 55.000000
2488 58960 boiler_output_temperature 1.476756e+12 58.000000
2489 58960 boiler_output_temperature 1.476756e+12 61.000000
现在我想为df1的每一行创建另一个数据帧,其中所有df2实例具有相同的ID并且满足条件属性name =' inside_temperature'它们的时间戳在df1列的时间帧开始和时间帧结束之内。
结果,我创建了18个不同的数据帧;一个用于df1中的每个实例 - 其中仅包括内部温度'和df1中定义的时间戳值。
home_id property_name timestamp_millis value
1 58960 inside_temperature 1.475849e+12 18.510000
2 58960 inside_temperature 1.475850e+12 19.810000
3 58960 inside_temperature 1.475850e+12 19.630000
4 58960 inside_temperature 1.475850e+12 19.470000
5 58960 inside_temperature 1.475850e+12 19.300000
6 58960 inside_temperature 1.475851e+12 19.470000
答案 0 :(得分:0)
由于我没有您的数据帧来重现代码,我只是给出一个通用建议,以避免for循环并将所有数据放在一个地方。
您可以使用tidyr和purrr包。
例如:
# group by Home.ID and nest
df1 <- df1 %>%
group_by(Home.ID) %>%
nest()
然后编写一个带有Home.ID和其余数据的函数,应用你想要过滤df2的条件,并给你一个带有所需行的df。
GetDetails <- function(id,data) {
# add your conditions to filter df2
df2 %>% filter(home_id==id &
property_name== 'inside_temperature' &
timestamp_millis> data$Timeframe_Start &
timestamp_millis< data$Timeframe_End
)
}
然后在保存列表的df中添加一列,每个列表都包含上一步中生成的df
df1 <- df1 %>%
mutate(All_Data=map2(Home.ID,data,GetDetails))
它可能需要一些修改,但通常这样会起作用并给你一个包含所有信息的18行的df。