2016-09-02 12 views
0

私は2つのデータセットを持っています。それぞれ2つのデータセットがあり、それぞれがPOSIXltフォーマットの日付と時刻の値とその他の数値と文字変数を含んでいます。R - 2つのデータフレームを最も近い時間 - 日付で結合するにはどうすればいいですか?

日時の列に基づいて両方のデータセットを結合したいと思います。 しかし、両方のデータセットの日付スタンプが一致しないので、それらを最も近い日付(前または後)で結合する必要があります。 私の例では、2016-03-01 23:52:00のデータ値 "e"は、 "binG"ではなく2016-03-02 00:00:00に "binH"と組み合わせる必要があります。

データセットを後であっても最も近い日付時刻の値で組み合わせる機能はありますか?

cut()関数を使用して日付を次の前日に結合する方法や、data.tablesのroll = Inf関数を使用する方法が見つかりました。しかし私はタイムスタンプをどんなフォーマットのロール= 'nearest'でも受け入れることができませんでした。

>df1 
    date1 value 
    1 2016-03-01 17:52:00  a 
    2 2016-03-01 18:01:30  b 
    3 2016-03-01 18:05:00  c 
    4 2016-03-01 20:42:30  d 
    5 2016-03-01 23:52:00  e 

    >df2 
    date2 bin_name 
    1 2016-03-01 17:00:00  binA 
    2 2016-03-01 18:00:00  binB 
    3 2016-03-01 19:00:00  binC 
    4 2016-03-01 20:00:00  binD 
    5 2016-03-01 21:00:00  binE 
    6 2016-03-01 22:00:00  binF 
    7 2016-03-01 23:00:00  binG 
    8 2016-03-02 00:00:00  binH 
    9 2016-03-02 01:00:00  binI 
+0

私はあなたが実際にPOSIXct形式を意味することを望みます。データフレームにPOSIXltベクトル(実際にはリスト)を格納することは、大混乱の処方箋です。 –

答えて

2

data.tableそれは多分に手動で日時の欄にその変換を行う(独自にPOSIXctにPOSIXltを変換する傾向があるものの、(あなたが直面して来ている?エラーを説明することができます)このために働く必要がありますdata.tableを満足させてください)。また、rollを使用する前にキー列を設定していることを確認してください。

(私は少し簡単にすることを私の人生を作るためにここに私自身の例でテーブルを作成しましたあなたはあなたにdput使用したい場合、私はあなたのデータで、この例を更新して満足している。):

new <- data.table(date = as.POSIXct(c("2016-03-02 12:20:00", "2016-03-07 12:20:00", "2016-04-02 12:20:00")), data.new = c("t","u","v")) 
head(new, 2) 

        date data.new 
1: 2016-03-02 12:20:00  t 
2: 2016-03-07 12:20:00  u 

old <- data.table(date = as.POSIXct(c("2016-03-02 12:20:00", "2016-03-07 12:20:00", "2016-04-02 12:20:00", "2015-03-02 12:20:00")), data.old = c("a","b","c","d")) 
head(old, 2) 


        date data.old 
1: 2016-03-02 12:20:00  a 
2: 2016-03-07 12:20:00  b 

setkey(new, date) 
setkey(old, date) 

combined <- new[ old, roll = "nearest" ] 
combined 

        date data.new data.old 
1: 2015-03-02 12:20:00  t  d 
2: 2016-03-02 12:20:00  t  a 
3: 2016-03-07 12:20:00  u  b 
4: 2016-04-02 12:20:00  v  c 

ローリングジョインで複数のマッチを扱う方法を示すために、2つのテーブルの行の長さを意図的に変更しました。あなたが参加する方法を切り替えることができます:

combined <- old[ new, roll = "nearest" ] 
combined 

        date data.old data.new 
1: 2016-03-02 12:20:00  a  t 
2: 2016-03-07 12:20:00  b  u 
3: 2016-04-02 12:20:00  c  v 
+1

@ user2223405このソリューションは機能しましたか?いずれにしても、あなたの質問を放棄しないようにしてください。戻って、働いていたものとされなかったものを教えてください。 – rosscova

関連する問題