2015-12-22 151 views
2

我需要根據特定日期,ID#s,事件開始時間和事件結束時間的組合,從第一個數據集(此處稱爲df1)中提取記錄與第二個數據集匹配(df2)。當只有一個日期,ID和事件開始和結束時間,但一些數據集之間的匹配記錄包含多個ID,日期或時間時,一切正常,並且我無法從df1獲取記錄到子集在這些情況下適當。我最終希望將它放在FOR循環或獨立函數中,因爲我有一個相當大的數據集。下面是我到目前爲止有:R:基於多個變量的多個變量的子集數據框

我一開始只是通過如下匹配的兩組數據之間的日期:

match_dates <- as.character(intersect(df1$Date, df2$Date)) 

於是我選擇了記錄df2基礎上,第一個匹配的日期,也保持其他列,所以我有其他的ID和時間信息,我需要:

records <- df2[which(df2$Date == match_dates[1]), ] 

日期,ID,開始,從records結束時間則:

​​

最後我子集df1之前和基於日期,ID在事件發生後,在records時間和合並他們進入所謂final獲得在包含在df1,我最終需要的數據的新的數據幀。

before <- subset(df1, NUM==records$ID & Date==records$Date & Time<records$Start) 
after <- subset(df1, NUM==records$ID & Date==records$Date & Time>records$End) 
final <- rbind(before, after) 

這裏是真正的問題 - 一些匹配的日期在df2超過1個對應的行,返回多個ID或時間。這裏是多條記錄的例子如下:

records <- df2[which(df2$Date == match_dates[25]), ] 

> records$ID 
[1] 507646 680845 680845 
> records$Date 
[1] "04-02-2009" "04-02-2009" "04-02-2009" 
> records$Start 
[1] "09:43" "05:37" "11:59" 
> records$End 
[1] "05:19" "11:29" "16:47" 

當我試圖在此基礎上於子集df1我得到一個錯誤:

before <- subset(df1, NUM==records$ID & Date==records$Date & Time<records$Start) 
Warning messages: 
1: In NUM == records$ID : 
    longer object length is not a multiple of shorter object length 
2: In Date == records$Date : 
    longer object length is not a multiple of shorter object length 
3: In Time < records$Start : 
    longer object length is not a multiple of shorter object length 

試圖爲每個ID,與日期做手工時間組合將會變得乏味。我有9年的數據價值,所有的數據集之間都有一個給定年份的多個匹配日期,所以理想情況下,我想將其設置爲FOR循環或帶有FOR循環的函數,但是我可以'不要過去這個。預先感謝任何提示!

+2

歡迎來到stackoverflow,@marcinus。如果您想回答這個問題,我們需要一個最低工作示例(MWE),我們可以使用它來解決您的問題。如果您需要在此處粘貼示例的子集,請使用'dput'。 –

+1

當你有多個匹配時,你的輸出結果有點不清楚。對於每個匹配的事件('records'中的所有內容),你剛剛在緊接着之前的一個事件之後,緊接着一個事件之後? 'data.table'軟件包絕對是您在大型數據集上進行這種「複雜」查詢的好朋友,儘管這裏有一條重要的學習曲線。正如blacksheep提到的,一個小的[可重現的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)在這裏很重要。 –

+0

經過一番修改之後,我意識到每個日期都有多個事件的複製,所以我沒有在事件前後查看,而是更改了代碼以獲取包含該事件的時間,最終將我帶到我一直在尋找相同的信息。 我能夠做到這一點沒有問題,但現在需要弄清楚如何在所有匹配日期上運行循環,以返回所有日期,時間和ID信息。 – marcinus

回答

0

如果你問我認爲你是從dplyr包與match函數結合使用的filter()函數,那麼你正在尋找。

> df1 <- data.frame(A = c(rep(1,4),rep(2,4),rep(3,4)), B = c(rep(1:4,3))) 
> df1 
    A B 
1 1 1 
2 1 2 
3 1 3 
4 1 4 
5 2 1 
6 2 2 
7 2 3 
8 2 4 
9 3 1 
10 3 2 
11 3 3 
12 3 4 
> df2 <- data.frame(A = c(1,2), B = c(3,4)) 
> df2 
    A B 
1 1 3 
2 2 4 
> filter(df1, A %in% df2$A, B %in% df2$B) 
    A B 
1 1 3 
2 1 4 
3 2 3 
4 2 4