我需要根據特定日期,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循環的函數,但是我可以'不要過去這個。預先感謝任何提示!
歡迎來到stackoverflow,@marcinus。如果您想回答這個問題,我們需要一個最低工作示例(MWE),我們可以使用它來解決您的問題。如果您需要在此處粘貼示例的子集,請使用'dput'。 –
當你有多個匹配時,你的輸出結果有點不清楚。對於每個匹配的事件('records'中的所有內容),你剛剛在緊接着之前的一個事件之後,緊接着一個事件之後? 'data.table'軟件包絕對是您在大型數據集上進行這種「複雜」查詢的好朋友,儘管這裏有一條重要的學習曲線。正如blacksheep提到的,一個小的[可重現的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)在這裏很重要。 –
經過一番修改之後,我意識到每個日期都有多個事件的複製,所以我沒有在事件前後查看,而是更改了代碼以獲取包含該事件的時間,最終將我帶到我一直在尋找相同的信息。 我能夠做到這一點沒有問題,但現在需要弄清楚如何在所有匹配日期上運行循環,以返回所有日期,時間和ID信息。 – marcinus