【问题标题】:R: Subset data frame based on multiple values for multiple variablesR:基于多个变量的多个值的子集数据框
【发布时间】:2016-03-29 07:23:48
【问题描述】:

我需要根据与第二个数据集 (@987654323 @)。当只有 1 个日期、ID 和事件开始和结束时间时一切正常,但数据集之间的某些匹配记录包含多个 ID、日期或时间,我无法从 df1 获取记录在这些情况下正确设置子集。我最终想把它放在一个 FOR 循环或独立函数中,因为我有一个相当大的数据集。到目前为止,这是我所得到的:

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

match_dates <- as.character(intersect(df1$Date, df2$Date))

然后我根据第一个匹配日期选择了df2 中的记录,同时保留了其他列,这样我就有了我需要的其他 ID 和时间信息:

records <- df2[which(df2$Date == match_dates[1]), ]

那么来自records 的日期、ID、开始和结束时间是:

[1] "01-04-2009" "599091"     "12:00"      "17:21" 

最后,我根据records 中的日期、ID 和时间对事件前后的df1 进行子集化,并将它们组合成一个名为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 提到的,一个小的 reproducible example 在这里很重要。
  • 经过更多修改后,我意识到每个日期都有多个事件复制,因此我没有查看事件之前和之后,而是更改了代码以获取包含事件在内的时间,其中最后会让我得到我正在寻找的相同信息。我能够毫无问题地做到这一点,但现在需要弄清楚如何在所有匹配的日期上运行一个循环,以返回所有日期、时间和 ID 信息。

标签: r date subset


【解决方案1】:

如果你问我认为你是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-06
    • 2016-03-19
    • 1970-01-01
    • 2019-10-22
    • 2020-09-26
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多