Сравнение значения столбца со всеми его ведущими значениями в dplyr :: mutate - PullRequest
4 голосов
/ 06 августа 2020

У меня есть данные, состоящие из одного вектора / столбца в таблице:

my_tibble <- tibble(score = c(1,2,3,4,9,8,7,6,5,4))

Для каждой строки my_tibble $ score я хочу вычислить разницу с самым большим «ведущим» элементом в том же столбце . Этот новый столбец будет называться «разница». Например, первая строка разницы должна быть 1–9, а пятая строка должна быть 9–8, а последняя строка изменится на NA, так как нет значения, идущего позади / ниже 4.

В конце концов, новый тиббл должен выглядеть так:

score | difference
<dbl>   <dbl>
1         -8
2         -7
3         -6
4         -5
9          1
8          1
7          1
6          1
5          1
4         NA

Я хочу добиться этого с помощью dplyr и до сих пор пробовал множество вариантов mutate, например

my_tibble %>%
 mutate(difference = score[which(score > score)])

Надеясь найти каким-то образом, чтобы вторая «оценка» в функции which ссылалась на текущую изменяемую строку. Однако я потерпел неудачу после нескольких часов попыток и отчаянных поисков решения в Интернете.

Ближайшее, что я нашел, было dplyr: суммирование n ведущих значений , однако это все еще оставляет меня с проблемой, которую я хотите разницы в максимальном ведущем значении всех ведущих значений, а не только ближайших n ведущих значений.

Помощь и / или отсылка к тому, где на этот вопрос уже были даны ответы или адресованы, приветствуются!

Ответы [ 3 ]

3 голосов
/ 06 августа 2020

Мое решение:

my_tibble <- my_tibble %>%
 mutate(difference = map_dbl(seq_along(score), function(y) ifelse(y == length(score),
 NA_real_, score[y] - max(c(score[-(1:y)])))))

Выход

> my_tibble
# A tibble: 10 x 2
   score difference
   <dbl>      <dbl>
 1     1         -8
 2     2         -7
 3     3         -6
 4     4         -5
 5     9          1
 6     8          1
 7     7          1
 8     6          1
 9     5          1
10     4         NA
3 голосов
/ 06 августа 2020

Один из способов - сделать:

library(dplyr)
library(purrr)

my_tibble %>%
  mutate(difference = c(map_dbl(seq_along(score)[-n()], ~ score[.x] - max(score[-(1:.x)])), NA))

# A tibble: 10 x 2
   score difference
   <dbl>      <dbl>
 1     1         -8
 2     2         -7
 3     3         -6
 4     4         -5
 5     9          1
 6     8          1
 7     7          1
 8     6          1
 9     5          1
10     4         NA
1 голос
/ 06 августа 2020

аналогично для l oop

  my_tibble$plouf <- NA
  N <- dim(my_tibble)[1]
  for(i in 1:N){
    my_tibble$plouf[i] <- max(my_tibble[(i+1):N,"score"])
  }
  
  my_tibble %>%
    mutate(diif = score - plouf)


   score plouf  diif
   <dbl> <dbl> <dbl>
 1     1     9    -8
 2     2     9    -7
 3     3     9    -6
 4     4     9    -5
 5     9     8     1
 6     8     7     1
 7     7     6     1
 8     6     5     1
 9     5     4     1
10     4    NA    NA
...