在数据帧之间查找。如果匹配,则返回count,max和min值

时间:2018-05-14 20:00:48

标签: r lookup

我是R的新手,似乎我发现问题的解决方案花费了太多时间。

我有2个数据帧:

 UniqueID  colA colB
 1          x     y
 2          x     y
 3          x     y
 4          x     y

UniqueID   category   date
 1           a        d1
 1           a        d2
 1           b        d3
 2           c        d4
 3           a        d5
 3           a        d6

我想获得一个数据帧,稍后将附加到第一个数据帧,例如(假设d1< d2和d5< d6)

 UniqueID    totaloccurrences  occurrencescatA MindatecatA MaxdatecatA
 1                  3                 2             d1          d2
 2                  1                 0             0            0
 3                  2                 2             d5           d6

对于每个Id我需要计算它在第二个数据帧中出现的总次数,然后计算每个类别的出现次数,并记录早期和最新的观察结果。

我能做的最好的就是使用for循环:

iteractions <- nrow(A) for (i in 1:iteractions) { compiled[i, "ID"] <- A[i, "UniqueID"] compiled[i, "totaloccurrences"] <- length(B$UniqueID[B$UniqueID ==compiled[i, "ID"]]) compiled[i, "occurrencescatA"] <- length(B$UniqueID[B$UniqueID ==compiled[i, "ID"] & B$category == "d1"] if (compiled[i, "occurencescatA"] != 0) { compiled[i, "MindatecatA"] <- min(B$date[B$category =="a" & B$UniqueID ==compiled[i, "ID"]])

...

依此类推最大日期,然后对每个类别重复。

问题是:数据框很大,这需要很长时间。我觉得我缺乏技巧,但是在这里任何帮助都会受到赞赏!

1 个答案:

答案 0 :(得分:0)

以下是tidyverse方法:

library(tidyverse);
printDate <- function(x) format(x, "%d-%m-%Y");
left_join(
    df2 %>% mutate(date = as.Date(date, format = "%d-%m-%Y")),
    df1) %>%
    group_by(UniqueID) %>%
    summarise(
        totaloccurrences = n(),
        occurrencescatA = sum(category == "a"),
        MindatecatA = ifelse(occurrencescatA > 0, printDate(min(date[category == "a"])), "0"),
        MaxdatecatA = ifelse(occurrencescatA > 0, printDate(max(date[category == "a"])), "0"))
## A tibble: 3 x 5
#  UniqueID totaloccurrences occurrencescatA MindatecatA MaxdatecatA
#     <int>            <int>           <int> <chr>       <chr>
#1        1                3               2 01-05-2018  02-05-2018
#2        2                1               0 0           0
#3        3                2               2 05-05-2018  06-05-2018

说明:执行df1df2的左连接,UniqueID的组条目,并使用summarise返回汇总数量。

请注意,我生成了一些示例date来说明。

样本数据

df1 <- read.table(text =
    "UniqueID  colA colB
 1          x     y
 2          x     y
 3          x     y
 4          x     y", header = T)


df2 <- read.table(text =
    "UniqueID   category   date
 1           a        01-05-2018
 1           a        02-05-2018
 1           b        03-05-2018
 2           c        04-05-2018
 3           a        05-05-2018
 3           a        06-05-2018", header = T)