R:基于多个变量的多个值的子集数据帧

时间:2015-12-22 22:59:30

标签: r date subset

我需要根据特定日期,ID#s,事件开始时间和与第二个数据集匹配的事件结束时间的组合从第一个数据集(此处称为df1)中提取记录( df2)。当只有1个日期,ID和事件开始和结束时间时,一切正常,但数据集之间的一些匹配记录包含多个ID,日期或时间,并且我无法从{获取记录{1}}在这些情况下正确分配。我最终想把它放在FOR循环或独立函数中,因为我有一个相当大的数据集。这是我到目前为止所得到的:

我开始只是匹配两个数据集之间的日期,如下所示:

df1

然后我根据第一个匹配日期在match_dates <- as.character(intersect(df1$Date, df2$Date)) 中选择了记录,同时保留了其他列,以便我获得其他ID和时间信息:

df2

records <- df2[which(df2$Date == match_dates[1]), ] 的日期,ID,开始和结束时间为:

records

最后,我根据[1] "01-04-2009" "599091" "12:00" "17:21" 中的日期,ID和时间对事件之前和之后的df1进行了子集,并将它们组合到一个名为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) 中有超过1个对应的行,并返回多个ID或时间。以下是多个记录的示例:

df2

当我尝试基于此集合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

尝试为每个ID日期 - 时间组合手动执行此操作将是单调乏味的方法。我有9年的数据,在数据集之间的给定年份都有多个匹配日期,所以理想情况下我想将其设置为FOR循环,或者在其中设置FOR循环的函数,但我可以&# 39;过去这个。提前感谢任何提示!

1 个答案:

答案 0 :(得分:0)

如果你问我认为你是什么,那么dplyr包中的过滤器()功能与match功能相结合可以满足您的需求。

> 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