通过根据另一个数据帧的条件对一个数据帧进行子集化来创建多个数据帧

时间:2016-11-08 11:27:16

标签: r for-loop

假设我有数据帧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

1 个答案:

答案 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。