我的数据是由tibble中的单个向量/列组成的:
my_tibble <- tibble(score = c(1,2,3,4,9,8,7,6,5,4))
对于my_tibble$score的每一行,我都希望计算出同一列中最大的“前导”元素的差值。这一新列应称为“差异”。例如,第一行差异应该是1-9,而第五行应该是9-8,最后一行将变成NA,因为后面/下面没有值。
最后,新的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)])
希望能找到第二个“分数”表示当前行正在发生变异的方法。然而,经过数小时的努力和绝望地在网上寻找解决方案后,我没有取得成功。
我发现的最接近的是dplyr: Summing n leading values,然而,这仍然给我留下了一个问题:我想要所有前导值的最大前导值的差值,而不仅仅是最近的n个前导值。
帮助和/或推荐到任何以前被回答或解决的地方都是非常感谢的!
发布于 2020-08-06 12:08:20
一种方法是:
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
发布于 2020-08-06 12:21:30
我的解决方案:
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
发布于 2020-08-06 12:11:17
类似于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
https://stackoverflow.com/questions/63282767
复制相似问题