2013-06-20 48 views
1

當我試圖回答關於堆棧溢出問題(Mapping multiple IDs using R)時,我遇到了如何完成它的問題。即,如何測試一組前後時間點之間是否存在時間點。如何判斷一組前後時間點之間是否存在一個時間點

從帖子的用戶沒有一個可重複的例子,但這是我想出了。我想用數據框emtek_file中的前後時間測試hidenic_file$hidenic_time中的時間點,並返回與每個hidenic_id的時間範圍相匹配的emtek_id。海報沒有提到它,但它似乎有可能多個emtek_id被返回爲每個hidenic_id

library(zoo) 
date_string <- paste("2001", sample(12, 10, 3), sample(28,10), sep = "-") 
time_string <- c("23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26", 
       "23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26") 

entry_emtek <- strptime(paste(date_string, time_string), "%Y-%m-%d %H:%M:%S") 
entry_emtek <- entry_emtek[order(entry_emtek)] 
exit_emtek <- entry_emtek + 3600 * 24 
emtek_file <- data.frame(emtek_id = 1:10, entry_emtek, exit_emtek) 

hidenic_id <- 110380:110479 
date_string <- paste("2001", sample(12, 100, replace = TRUE), sample(28,100, replace = T), sep = "-") 
time_string <- rep(c("23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26", 
       "23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26"),10) 
hidenic_time <- strptime(paste(date_string, time_string), "%Y-%m-%d %H:%M:%S") 
hidenic_time <- hidenic_time[order(hidenic_time)] 
hidenic_file <- data.frame(hidenic_id, hidenic_time) 

##Here is where I fail to write concise and working code to find what I want. 
combined_file <- list() 
for(i in seq(hidenic_file[,1])) { 
    for(j in seq(emtek_file[,1])) { 
    if(length(zoo(1, emtek_file[j,2:3]) + zoo(1,hidenic_file[i,2])) == 0) {next} 
    if(length(zoo(1, emtek_file[j,2:3]) + zoo(1,hidenic_file[i,2])) == 1) {combined_file[[i]] < c(combinedfile[[i]],emtek_file[j,1])} 
    } 
    names(combined_file)[i] <- hidenic_file[i,1] 
} 
+0

你忘了'庫(動物園)',當我嘗試運行你的循環,我得到一個錯誤。對於我們來說,添加預期結果會更容易:combined_file? – agstudy

+0

哎呦。現在用庫(動物園)編輯。我提到循環不起作用,但這是我解決我的問題的最佳嘗試。你能改說最後一句嗎? – cylondude

+0

我對「這裏是我寫不出簡潔的地方」的理解,它工作但效率不高:)我的最後一句話,我的意思是預期的結果是什麼? – agstudy

回答

1

由於您沒有提供預期的結果,我不確定要理解所有想做的事情。這裏使用一個解決方案使用IRanges包。在一讀時可能不是很容易理解,但對於連續間隔找到重疊非常有用。

library(IRanges) 
## create a time intervals 
subject <- IRanges(as.numeric(emtek_file$entry_emtek), 
     as.numeric(emtek_file$exit_emtek)) 
## create a time intervals (start=end here) 
query <- IRanges(as.numeric(hidenic_file$hidenic_time), 
     as.numeric(hidenic_file$hidenic_time)) 
## find overlaps and extract rows (both time point and intervals) 
emt.ids <- subjectHits(findOverlaps(query,subject)) 
hid.ids <- queryHits(findOverlaps(query,subject)) 
cbind(hidenic_file[hid.ids,],emtek_file[emt.ids,]) 

hidenic_id  hidenic_time emtek_id   entry_emtek   exit_emtek 
8  110387 2001-03-13 22:29:56  3 2001-03-13 22:29:56 2001-03-14 22:29:56 
9  110388 2001-03-14 01:03:30  3 2001-03-13 22:29:56 2001-03-14 22:29:56 
41  110420 2001-06-09 16:56:26  7 2001-06-09 16:56:26 2001-06-10 16:56:26 

PS:安裝包:

source("http://bioconductor.org/biocLite.R") 
    biocLite("IRanges") 
+1

我想我可以更具體地瞭解我的數據。我首先嚐試獲得一個真實的結果,然後根據我以後想要的形狀來操縱形狀。感謝您向我介紹IRanges! – cylondude

+0

@cyclondude歡迎您。結果的形狀並不重要,但預期的結果本身,它隱藏在hidenic_file中,以及您希望得到的emtek_file中的id。 – agstudy

相關問題