【问题标题】:Comparing a column value to all its leading values within dplyr::mutate将列值与 dplyr::mutate 中的所有前导值进行比较
【发布时间】:2020-08-06 11:38:12
【问题描述】:

我的数据由小标题中的单个向量/列组成:

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 来实现这一点,到目前为止,我已经尝试了许多 mutate 的变体,比如

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

希望找到某种方式,使 which 函数中的第二个“分数”指代正在变异的当前行。然而,经过数小时的尝试和拼命在网上寻找解决方案,我没有成功。

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

非常感谢帮助和/或推荐到之前已回答或解决的任何地方!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我的解决方案:

    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
    

    【讨论】:

      【解决方案2】:

      一种方法是:

      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】:

        类似于 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
        

        【讨论】:

          猜你喜欢
          • 2022-08-23
          • 1970-01-01
          • 2022-08-05
          • 1970-01-01
          • 2019-12-31
          • 1970-01-01
          • 1970-01-01
          • 2020-06-13
          • 1970-01-01
          相关资源
          最近更新 更多