我需要根据与第二个数据集 ( df1
) 匹配的特定日期、ID#、事件开始时间和事件结束时间的组合,从第一个数据集(此处称为 df2
)中提取记录。当只有 1 个日期、ID 和事件开始和结束时间时一切正常,但是数据集之间的某些匹配记录包含多个 ID、日期或时间,我无法从 df1
获取记录在这些情况下正确子集。我最终想把它放在一个 FOR 循环或独立函数中,因为我有一个相当大的数据集。这是我到目前为止所得到的:
我开始只是匹配两个数据集之间的日期,如下所示:
match_dates <- as.character(intersect(df1$Date, df2$Date))
然后我选择了
df2
中的记录基于第一个匹配日期,同时保留其他列,以便我获得所需的其他 ID 和时间信息:records <- df2[which(df2$Date == match_dates[1]), ]
日期、ID、开始和结束时间来自
records
然后是:[1] "01-04-2009" "599091" "12:00" "17:21"
最后我子集
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 循环的函数,但我不能不要通过这个。提前感谢您的任何提示!
最佳答案
如果您问我认为您是 dplyr 中的 filter() 函数吗?套餐结合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
关于R:基于多个变量的多个值的子集数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34425847/