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

标签 r date subset

我需要根据与第二个数据集 ( 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/

相关文章:

php - Mysql 将 varchar 转换为 php 日期

mysql - 使用 mySQL WEEK() 查找本周的日期时结果为空

macos - 在 OS X (10.6) bash 中使用 unix 日期导致 "illegal time format"错误

r - 安装AWS S3 R包

r - For 循环未正确索引 - 将 for 循环的结果放入矩阵中

r - 降低无效的多字节字符串 - 忽略转义

ruby - 生成集合的所有 "unique"子集(不是幂集)

r - 基于变量列名的子集

r - 如何减少(子集)列表列表?

r - 调用父 Shiny 服务器中的 react 数据集的 Shiny 模块