代码之家  ›  专栏  ›  技术社区  ›  cliu

根据不同个体的时间点列表提取数据

  •  0
  • cliu  · 技术社区  · 4 年前

    我试图根据不同个体所需的时间点列表提取数据集的行。在base R中是怎样做的?

    以下是原始数据集:

    data.frame(id=rep(1:3, each=3), time=1:3, y=c(1:9))
    

    下面是我要用于提取数据的每个id的时间点列表:

    $`1` #this is id 1
     [1] 1 2 #these are the time points I need for id 1
    
    $`2`
     [1] 1 3
    
    $`3`
     [1] 2 3
    

    最终数据如下所示:

      id time y
       1    1 1
       1    2 2
       2    1 4
       2    3 6
       3    2 8
       3    3 9
    
    2 回复  |  直到 4 年前
        1
  •  1
  •   Ronak Shah    4 年前

    以下是遵循相同逻辑的两种方法。

    在R底-

    do.call(rbind, Map(function(p, q) subset(data, id == q & time %in% p), 
            lst, names(lst)))
    

    或使用 tidyverse -

    library(dplyr)
    library(purrr)
    
    purrr::imap_dfr(lst, ~data %>% filter(id == .y, time %in% .x))
    
    #  id time y
    #1  1    1 1
    #2  1    2 2
    #3  2    1 4
    #4  2    3 6
    #5  3    2 8
    #6  3    3 9
    

    数据

    data <- data.frame(id=rep(1:3, each=3), time=1:3, y= 1:9)
    lst <- list(`1` = c(1, 2), `2` = c(1, 3), `3` = c(2, 3))
    
        2
  •  1
  •   Jon Spring    4 年前

    使用左连接的一种方法:

    df <- data.frame(id=rep(1:3, each=3), time=1:3, y=c(1:9))
    want <- data.frame(id = rep(1:3, each = 2), 
                       time = c(1,2,1,3,2,3))
    
    merge(want, df, all.x = TRUE)      
    

    后果

      id time y
    1  1    1 1
    2  1    2 2
    3  2    1 4
    4  2    3 6
    5  3    2 8
    6  3    3 9