2017-12-15 13 views
0

私は調和しようとしている2つのチブルデータフレームを持っています。最初tibbleは、次のように最初の数行である百万を超える観測を、有する:他のテーブルに基づいて観測データを検索する

data 
    ID Time(Converted to number) 
    1 23160 
    1 23161 
    1 23162 
    1 23163 
    1 23164 
    1 23165 
    2 24251 
    2 24252 

次のように第二tibbleルックアップテーブル(すなわち、発生した特定のイベントの情報を持っている)、簡易版である:

 lookup_table 
    ID Event_Time Event_Indicator Number_of_Cumulative_Events 
    1 23162   1     1 
    1 23164   1     2 
    2 24255   1     1 
    2 24280   0     1 

最初のチブルに3番目の列を作成して、その時点の累積イベント数を表示したいとします。上記の例では3番目の列には、したがって、次のようになります。私はので、計算時間のルックアップテーブルにEVENT_TIMEに各観測の時間を比較するための観測数百万人をループすることを避けるためにしようとしています

ID Time(Converted to number) Number 
    1 23160      0  
    1 23161      0 
    1 23162      1 
    1 23163      1 
    1 23164      2 
    1 23165      2 
    2 24251      0 
    2 24252      0 

しかし、ループを使用せずにこれを行う方法についてはわかりません。問題は、すべてのIDが唯一の一度だけlookup_tableに登場した場合lookup_tableが、私は何ができる、いくつかのIDを複数回含まれていることである:私はループの使用を避け、まだ適用できるか

 data$Event_Time <- lookup_table[match(data$ID, lookup_table$ID),"Event_Time"] 
    data$Number <- data %>% mutate(ifelse(Time >= Event_Time,1,0)) 

任意のアイデア各観測のルックアップ条件は?ありがとうございました。

編集:私はテーブルに参加しようとはしていませんが、lookup_tableとdataテーブルの時間カラムを比較して私の希望のカラムを取得する方法があります。私は非効率的なループ機能を記述した場合の例では、それは次のようになります。

 for (i in 1:nrow(data)) { 
      data$Number[i] <- subset(lookup_table,ID == data$ID[i])[max(which 
     (data$Time[i] >= lookup_table$Event_Time)), "Number_of_Cumulative_Events"] 
    } 

答えて

2

可能な解決策は、参加後の累積イベントをカウントすることです。参加時にの更新がであることに注意してください。

ID Time new 
1: 1 23160 0 
2: 1 23161 0 
3: 1 23162 1 
4: 1 23163 1 
5: 1 23164 2 
6: 1 23165 2 
7: 2 24251 0 
8: 2 24252 0 

また

library(data.table) 
setDT(data)[, new := 0L][setDT(lookup_table), on = .(ID, Time = Event_Time), new := Event_Indicator][ 
    , new := cumsum(new), by = ID][] 

setDT(data)[setDT(lookup_table), on = .(ID, Time = Event_Time), new := Event_Indicator][ 
    is.na(new), new := 0][ 
    , new := cumsum(new), by = ID][] 

が参加した後にゼロに不足している項目を設定します。

A全く異なるアプローチがに参加ローリングを使用することです:

lookup_table[, !"Event_Indicator"][data, on = .(ID, Event_Time = Time), roll = TRUE] 
ID Event_Time Number_of_Cumulative_Events 
1: 1  23160       NA 
2: 1  23161       NA 
3: 1  23162       1 
4: 1  23163       1 
5: 1  23164       2 
6: 1  23165       2 
7: 2  24251       NA 
8: 2  24252       NA 

NA年代は、説明のために放置されています)

+0

こんにちは、おかげでたくさんそれは動作します!しかし、もう1つの問題は、データの観測結果の一部が欠落していることです(ID = 3の場合、利用可能な期間データは23550,23551,23552、次に23560にジャンプ)。その場合、期間23553にあるイベントは、累積合計で捕捉されないであろう。私はこれを新しい列に因数分解できる方法はありますか? – NubCookie

関連する問題