首页 文章

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

提问于
浏览
0

假设我有数据帧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列的时间帧start和timeframe end之内 .

结果,我创建了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

    由于我没有您的数据帧来重现代码,我只是给出一个通用建议,以避免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 .

相关问题