Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Calculate the difference if the values in one column match

I have some longitudinal data where the obversions of some individuals are missing at some time points:

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))

I want to calculate the difference between two individuals if they share the same time point, otherwise we pad them with NA. The expected outcome is below:

 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

How do I achieve this in a fast way? I have a much larger dataset.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

Using dplyr:

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

Gives:

# 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
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading