我需要根据特定日期,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