【问题标题】:Replicating values in R by group按组复制 R 中的值
【发布时间】:2019-07-25 16:16:25
【问题描述】:

我有一个数据集,其中包含测量结果和收集数据的具体日期。我想在几天之间复制这些值,直到最后一个测量日。例如,这里是复制前的数据:

           Measurement    Day
Subject1   .86            1            
Subject1   .91            7            
Subject1   .83            9            
Subject2   .77            0            
Subject2   .82            5            
Subject2   .86            12    

我想在 R 中修改上面的数据集,如下所示:

           Measurement    Day
Subject1   .86            1
Subject1   .86            2
Subject1   .86            3
Subject1   .86            4
Subject1   .86            5 
Subject1   .86            6           
Subject1   .91            7
Subject1   .91            8            
Subject1   .83            9            
Subject2   .77            0
Subject2   .77            1
Subject2   .77            2
Subject2   .77            3
Subject2   .77            4       
Subject2   .82            5          
Subject2   .82            6
Subject2   .82            7     
Subject2   .82            8     
Subject2   .82            9     
Subject2   .82            10
Subject2   .82            11                      
Subject2   .86            12    

我认为这可以通过 dplyr 或 data.table 包来完成。

【问题讨论】:

    标签: arrays r loops dplyr


    【解决方案1】:

    我们可以使用complete。假设 OP 的输入数据是 matrix(因为 data.frame 不允许重复的行名并假设存在 row.names - 哇很多假设),创建一个带有 as.data.frame 的 data.frame @ 987654325@将 row.names 作为一列,按“主题”分组,使用 complete 获取“Day”的完整序列,然后使用 fill“Measurement”中的 NA 和非 NA 先前值

    library(tidyverse)    
    cbind(Subject = row.names(dat), as.data.frame(dat)) %>%
       group_by(Subject) %>%
       complete(Day = first(Day):last(Day)) %>%
       fill(Measurement) %>%
       select(Subject, Measurement, Day)
    # A tibble: 22 x 3
    # Groups:   Subject [2]
    #   Subject  Measurement   Day
    #   <fct>          <dbl> <dbl>
    # 1 Subject1        0.86     1
    # 2 Subject1        0.86     2
    # 3 Subject1        0.86     3
    # 4 Subject1        0.86     4
    # 5 Subject1        0.86     5
    # 6 Subject1        0.86     6
    # 7 Subject1        0.91     7
    # 8 Subject1        0.91     8
    # 9 Subject1        0.83     9
    310 Subject2        0.77     0
    # … with 12 more rows
    

    数据

    dat <- structure(c(0.86, 0.91, 0.83, 0.77, 0.82, 0.86, 1, 7, 9, 0, 5, 
    12), .Dim = c(6L, 2L), .Dimnames = list(c("Subject1", "Subject1", 
    "Subject1", "Subject2", "Subject2", "Subject2"), c("Measurement", 
    "Day")))
    

    【讨论】:

      【解决方案2】:
      > foo = function(x){
      +     r = range(x)
      +     as.numeric(seq(r[1], r[2]) %in% x)
      + }
      > do.call(rbind, lapply(split(1:NROW(dat), row.names(dat)), function(i){
      +     temp = dat[i,]
      +     temp = temp[with(rle(cumsum(foo(temp[,"Day"]))), rep(seq_along(lengths), lengths)),]
      +     temp[,"Day"] = ave(temp[, "Day"], temp[,"Day"], FUN = function(x) x + (1:length(x) - 1))
      +     temp
      + }))
               Measurement Day
      Subject1        0.86   1
      Subject1        0.86   2
      Subject1        0.86   3
      Subject1        0.86   4
      Subject1        0.86   5
      Subject1        0.86   6
      Subject1        0.91   7
      Subject1        0.91   8
      Subject1        0.83   9
      Subject2        0.77   0
      Subject2        0.77   1
      Subject2        0.77   2
      Subject2        0.77   3
      Subject2        0.77   4
      Subject2        0.82   5
      Subject2        0.82   6
      Subject2        0.82   7
      Subject2        0.82   8
      Subject2        0.82   9
      Subject2        0.82  10
      Subject2        0.82  11
      Subject2        0.86  12
      

      【讨论】:

        【解决方案3】:

        略基于@akrun 的回答

         library(tidyverse)
        
            df <- cbind(Subject = row.names(dat), as.data.frame(dat))
        
            df %>% group_by(Subject) %>% 
              mutate(day_diff = c(diff(Day), 1)) %>% 
              uncount(day_diff) %>% 
              mutate(Day = first(Day):last(Day)) %>% 
              ungroup()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-18
          相关资源
          最近更新 更多