2016-11-08 122 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存放所有信息。

相關問題