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

如果一列中的值匹配,则计算差值

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

    我有一些纵向数据,其中一些人的obversion在某些时间点缺失:

    df <- data.frame(id = c(1, 1, 1, 1, 1, 2, 2, 2), #id2 is missing for time 3 and 5
                     time = c(1, 2, 3, 4, 5, 1, 2, 4),
                     value = c(3, 4, 2, 55, 5, 9, 43, 22))
    

    如果两个人共享同一时间点,我想计算他们之间的差异,否则我们用 NA .预期结果如下:

     id  time value  diff
      1    1     3    -6  #the time point matches and so calculate the difference
      1    2    46     3  
      1    3     2    NA
      1    4    55    33
      1    5     5    NA
      2    1     9    -6
      2    2    43     3
      2    3    NA    NA
      2    4    22    33
      2    5    NA    NA
    

    如何快速实现这一目标?我有一个更大的数据集。

    1 回复  |  直到 3 年前
        1
  •  2
  •   Axeman    3 年前

    使用 dplyr :

    df %>% 
      arrange(id) %>%                                    # make sure id 1 comes first
      group_by(time) %>% 
      mutate(diff = ifelse(n() == 2, -diff(value), NA)) %>%
      ungroup()
    

    提供:

    # A tibble: 8 × 4
         id  time value  diff
      <dbl> <dbl> <dbl> <dbl>
    1     1     1     3    -6
    2     1     2     4   -39
    3     1     3     2    NA
    4     1     4    55    33
    5     1     5     5    NA
    6     2     1     9    -6
    7     2     2    43   -39
    8     2     4    22    33