首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将列值与dplyr::mutate中的所有前导值进行比较

将列值与dplyr::mutate中的所有前导值进行比较
EN

Stack Overflow用户
提问于 2020-08-06 11:38:12
回答 3查看 249关注 0票数 5

我的数据是由tibble中的单个向量/列组成的:

代码语言:javascript
运行
复制
my_tibble <- tibble(score = c(1,2,3,4,9,8,7,6,5,4))

对于my_tibble$score的每一行,我都希望计算出同一列中最大的“前导”元素的差值。这一新列应称为“差异”。例如,第一行差异应该是1-9,而第五行应该是9-8,最后一行将变成NA,因为后面/下面没有值。

最后,新的tibble看起来应该是这样的:

代码语言:javascript
运行
复制
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来实现这一点,到目前为止,我已经尝试了许多变体,例如

代码语言:javascript
运行
复制
my_tibble %>%
 mutate(difference = score[which(score > score)])

希望能找到第二个“分数”表示当前行正在发生变异的方法。然而,经过数小时的努力和绝望地在网上寻找解决方案后,我没有取得成功。

我发现的最接近的是dplyr: Summing n leading values,然而,这仍然给我留下了一个问题:我想要所有前导值的最大前导值的差值,而不仅仅是最近的n个前导值。

帮助和/或推荐到任何以前被回答或解决的地方都是非常感谢的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-06 12:08:20

一种方法是:

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2020-08-06 12:21:30

我的解决方案:

代码语言:javascript
运行
复制
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)])))))

输出

代码语言:javascript
运行
复制
> 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
票数 4
EN

Stack Overflow用户

发布于 2020-08-06 12:11:17

类似于for循环

代码语言:javascript
运行
复制
  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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63282767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档