簡體   English   中英

將列值與 dplyr::mutate 中的所有前導值進行比較

[英]Comparing a column value to all its leading values within dplyr::mutate

我的數據由小標題中的單個向量/列組成:

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

對於 my_tibble$score 的每一行,我想計算與同一列中最大“前導”元素的差異。 這個新列應稱為“差異”。 例如,第一行的差異應該是 1 - 9,而第五行應該是 9 - 8,最后一行將變為 NA,因為沒有值落后/低於 4。

最后,新的 tibble 應該是這樣的:

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 來實現這一點,並且到目前為止已經嘗試了許多變異,比如

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

希望找到某種方式,使 which 函數中的第二個“分數”指的是當前正在變異的行。 然而,經過數小時的嘗試和拼命在網上尋找解決方案,我沒有成功。

我找到的最接近的是dplyr: Summing nleading values ,但這仍然給我留下了一個問題,即我想要所有前導值的最大前導值的差異,而不僅僅是最接近的 n 前導值。

非常感謝您提供幫助和/或推薦給之前已回答或解決的任何地方!

我的解決方案:

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

Output

> 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

一種方法是:

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

類似於 for 循環

  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM