【发布时间】:2016-03-29 07:23:48
【问题描述】:
我需要根据与第二个数据集 (@987654323 @)。当只有 1 个日期、ID 和事件开始和结束时间时一切正常,但数据集之间的某些匹配记录包含多个 ID、日期或时间,我无法从 df1 获取记录在这些情况下正确设置子集。我最终想把它放在一个 FOR 循环或独立函数中,因为我有一个相当大的数据集。到目前为止,这是我所得到的:
我只是通过匹配两个数据集之间的日期开始,如下所示:
match_dates <- as.character(intersect(df1$Date, df2$Date))
然后我根据第一个匹配日期选择了df2 中的记录,同时保留了其他列,这样我就有了我需要的其他 ID 和时间信息:
records <- df2[which(df2$Date == match_dates[1]), ]
那么来自records 的日期、ID、开始和结束时间是:
[1] "01-04-2009" "599091" "12:00" "17:21"
最后,我根据records 中的日期、ID 和时间对事件前后的df1 进行子集化,并将它们组合成一个名为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 提到的,一个小的 reproducible example 在这里很重要。 -
经过更多修改后,我意识到每个日期都有多个事件复制,因此我没有查看事件之前和之后,而是更改了代码以获取包含事件在内的时间,其中最后会让我得到我正在寻找的相同信息。我能够毫无问题地做到这一点,但现在需要弄清楚如何在所有匹配的日期上运行一个循环,以返回所有日期、时间和 ID 信息。