【问题标题】:Lookup observations data based on another table根据另一个表查找观察数据
【发布时间】:2018-05-29 16:41:31
【问题描述】:

我有 2 个要协调的 tibble 数据帧。第一个小标题有超过一百万个观察值,前几行如下:

    data
    ID  Time(Converted to number)  
     1    23160
     1    23161
     1    23162
     1    23163
     1    23164
     1    23165
     2    24251
     2    24252

第二个小标题是一个查找表(其中包含已发生的特定事件的信息),简化版本如下:

     lookup_table
     ID  Event_Time  Event_Indicator Number_of_Cumulative_Events
     1    23162           1                    1
     1    23164           1                    2
     2    24255           1                    1
     2    24280           0                    1

我想在第一个 tibble 中创建第三列,以便显示观察时累积事件的数量。因此,上述示例中的第 3 列将是:

    ID  Time(Converted to number)  Number 
     1    23160                     0      
     1    23161                     0
     1    23162                     1
     1    23163                     1
     1    23164                     2
     1    23165                     2
     2    24251                     0
     2    24252                     0

由于计算时间的原因,我试图避免必须遍历数百万个观察结果来将每个观察结果的时间与查找表中的 Event_Time 进行比较。

但是,我不确定如何在不使用循环的情况下执行此操作。问题是lookup_table多次包含一些ID,如果所有ID只出现在lookup_table中一次,那么我可以这样做:

     data$Event_Time <- lookup_table[match(data$ID, lookup_table$ID),"Event_Time"] 
     data$Number <- data %>% mutate(ifelse(Time >= Event_Time,1,0))

有什么想法可以避免使用循环并为每个观察应用查找条件吗?谢谢。

编辑:我不是想加入表格,而是更多地比较lookup_table和数据表中的时间列以获得我想要的列。例如,如果我要编写一个低效的循环函数,它将是:

     for (i in 1:nrow(data)) {
          data$Number[i] <- subset(lookup_table,ID == data$ID[i])[max(which
         (data$Time[i] >= lookup_table$Event_Time)), "Number_of_Cumulative_Events"]
     }

【问题讨论】:

    标签: r


    【解决方案1】:

    一种可能的解决方案是计算加入后 的累积事件。请注意,使用了加入更新

    library(data.table)
    setDT(data)[, new := 0L][setDT(lookup_table), on = .(ID, Time = Event_Time), new := Event_Indicator][
      , new := cumsum(new), by = ID][]
    
       ID  Time new
    1:  1 23160   0
    2:  1 23161   0
    3:  1 23162   1
    4:  1 23163   1
    5:  1 23164   2
    6:  1 23165   2
    7:  2 24251   0
    8:  2 24252   0
    

    或者,

    setDT(data)[setDT(lookup_table), on = .(ID, Time = Event_Time), new := Event_Indicator][
      is.na(new), new := 0][
        , new := cumsum(new), by = ID][]
    

    将在加入后将缺失的条目设置为零。

    一种完全不同的方法是使用滚动连接

    lookup_table[, !"Event_Indicator"][data, on = .(ID, Event_Time = Time), roll = TRUE]
    
       ID Event_Time Number_of_Cumulative_Events
    1:  1      23160                          NA
    2:  1      23161                          NA
    3:  1      23162                           1
    4:  1      23163                           1
    5:  1      23164                           2
    6:  1      23165                           2
    7:  2      24251                          NA
    8:  2      24252                          NA
    

    NA's 保持不变以供说明)

    【讨论】:

    • 嗨,非常感谢!只是另一个问题,数据中的一些观察结果缺失(例如,对于 ID = 3,可用的时间段数据是 23550、23551、23552,然后跳转到 23560)。在这种情况下,在时间段 23553 的事件将不会被捕获在累积总和中。有什么方法可以将其纳入新列?
    猜你喜欢
    • 1970-01-01
    • 2019-11-20
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多