![](/img/trans.png)
[英]dplyr::mutate comparing each value to vector, collapsing with any/all
[英]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.