2015-12-22 150 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