Вычитание значений в одном столбце на основе двух других столбцов в R

#r #dataframe #dplyr

Вопрос:

Я пытаюсь вычесть значения в одном столбце на основе переменных в двух других столбцах. Это усложняется тем, что не все «идентификаторы» находятся на всех сайтах до и после. Вот пример фрейма данных:

 > time <- c("before", "after", "before", "after", "before", "after", "before")
> site <- c("red", "red","red", "red","green", "green", "blue")
> ID <- c('A','A','B','B','B','B','C')
> cover <- c('10','5','10','5','10','5','3')
> df <- data.frame(time, site, ID, cover)

    time  site ID cover
1 before   red  A    10
2  after   red  A     5
3 before   red  B    10
4  after   red  B     5
5 before green  B    10
6  after green  B     5
7 before  blue  C     3

 

Вы можете видеть, что раньше буква «С» появлялась только синим цветом.
Результат будет выглядеть так:

    site ID diff
1   red  A   -5
2   red  B   -5
3 green  B   -5
4  blue  C <NA>

 

Я попробовал этот код, найденный в другом сообщении о переполнении стека с аналогичным вопросом, но я не могу заставить его работать.

 df_new <- df %>% group_by(time, site, ID) %>% 
summarise(diff = cover[time == c("after")] - cover[time == c("before")])

 

Есть идеи, где я ошибаюсь?

Спасибо!

Ответ №1:

Мы можем создать группу diff с условием, чтобы проверить с помощью if/else

 library(dplyr)
df %>% 
    group_by(site, ID) %>% 
    summarise(diff = if(length(cover) == 1) NA 
         else diff(cover), .groups = 'drop')
 

-выход

 # A tibble: 4 x 3
  site  ID     diff
  <chr> <chr> <dbl>
1 blue  C        NA
2 green B        -5
3 red   A        -5
4 red   B        -5
 

Исходный код OP не работает, потому что в одной из группировок нет как «после», так и » до » во «времени». Возможно, нам потребуется указать if/else условие для этого