2016-11-08 158 views
0

假设我有数据帧DF1通过基于另一个数据帧的条件子集划分一个数据帧中创建多个dataframes

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_ids,但它的许多不同实例(这里只是显示它的一部分)

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的每一行与有相同的ID,并满足以下条件:属性名DF2的所有实例另一个数据帧=“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

我们需要你的努力。请分享您迄今尝试的代码。 – Neil

+0

我尝试过**(for df1){ nam < - paste(“control”,df1 $ Home.ID,“it”,sep =“。”) assign(nam,subset(df2,df2 $ home_id == df1 $ Home.ID&df2 $ property_name ==“inside_temperature”&df2 $ timestamp_millis> = df1 $ Timeframe_Start&df2 $ timestamp_millis <= df1 $ Timeframe_End)} **但是这给了我错误“更长的对象长度不是多倍较短的物体长度“ – GNee

回答

0

因为我没有你的数据框来重现代码,所以我只是给出一个通用的建议来避免for-loops并将所有的数据放在一个地方。

您可以使用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存放所有信息。

相关问题