2017-02-21 73 views
0

我有一個關於從R中的數據框中搜索和查找值的問題。假設我有一大堆不同列的數據框,並且數據中有一部分框架如:在數據框中搜索最近的值

Instrument |  Time  | Microsecond 
------------------------------------------- 
    .... |  ....  |  .... 
------------------------------------------- 
ABC  | 10:32:40 |  420 
------------------------------------------- 
ABC  | 10:32:40 |  422 
------------------------------------------- 
    .... |  ....  |  ....  

現在,讓我們也說,例如,我有值/字符串表示爲:

時間:十點32分40秒

微秒:421

基本上,我想知道在R中(或在data.table包中)是否有函數或方法,它允許我使用時間和微秒信息來搜索數據幀,以便它可以找到最接近的「較低」值(或值等於)時間和微秒值。例如,對於我給出的時間:10:32:40和微秒:421信息,數據幀中最接近的較低值將是時間:10:32:40和微秒:420.

另外,I想要在數據幀中找到最接近的'上'值(或值等於),其(對於上面的示例數據幀)將是時間:10:32:40和微秒:422。我想找到最接近的低/高值或(值等於)我擁有的信息。我的意思是「值等於」,如果數據框中有一行與我所擁有的信息完全相同(即:時間:10:32:40和微秒:421),那麼我想用這個而不是使用「最接近的」值 - 直截了當地說,如果數據框中的行信息與我擁有的信息完全相同,那麼與「最接近」值相比,我具有更高的優先級。

我還應該注意,除了「微秒」列之外,我希望能夠找到「時間」列的最接近的值,因爲我可能必須向上/向下舍入「時間」列中的值。

有沒有可以做到這一點的功能或方法?如果我說的不清楚,請讓我知道。

+0

在這裏搜索'data.table'的'滾動連接'或'非等值連接'的Stackoverflow - 我認爲這對你可能是有用的。例如。 - http://stackoverflow.com/questions/32634923/data-table-rolling-join-within-range – thelatemail

+0

謝謝,我現在檢查一下! – ThePlowKing

回答

0

我認爲處理它的最佳方法是隻保留行沒有重複

notDupes<- your_df[-duplicated(your_df),] 
arrange(notDupes,Time, Microsecond) 

然後,你將具有按照升序排序的所有相關時間,然後按升序微秒。一旦按順序排列,您就可以通過簡單地取三個連續的行來選擇更高和更低的最近時間(首先測試是否有任何行重複)。

dupes<- your_df[duplicated(your_df),] 

它不包含重複行的第一個實例,但是包含它的所有以下重複項。

如果您想要整個列表,您可以將訂單倒轉並第二次運行,然後從另一箇中減去一個,然後將差異添加到第一個。

+0

感謝您的回覆!目前,數據框已經按升序排列,我最初使用你提到的方法(我使用which()函數在數據框中查找與我的信息匹配的確切行)。我目前遇到的問題是,對於我所擁有的一些信息,數據框中沒有與之匹配的行,所以我試圖找到一個函數或方法能夠找到最接近的值/字符串與我的信息相匹配的數據框架 – ThePlowKing

+0

如果按照重要性,時間和微秒順序對所有字段進行排序,那麼您的下一個最接近的時間應該在右上方和右下方... – sconfluentus

+0

不幸的是,我必須保留所有的行,即使他們看起來像他們重複。這是一個奇怪的問題,但這是由於數據幀不包含「全部」信息,事實上應該是納秒級列,以使事情完全準確 - 如果有納秒然後我不會有任何問題:( – ThePlowKing