繁体   English   中英

我如何在 tidyverse 中使用 purr 递归地在 tibble 中添加值

[英]How would I recursively add values in a tibble using purr in the tidyverse

我是 R 和 tidyverse 的新手,我试图了解如何使用 purrr 递归添加。

我有一个由 8 行和 4 列组成的小标题。 tibble 中的数据代表比赛中两点的跑步者。 列如下:

  • 点 - 比赛中的点(即 1/2 路和终点)
  • position - 跑步者当时在比赛中的位置
  • 跑步者 - 跑步者的名字
  • lengthsAhead - 跑步者领先下一位跑步者的距离

我想计算被击败的长度,定义为第一名跑步者后面的长度数。 例如,对于第一名的跑者来说,打过的长度将为 0,并且将是 lengthsAhead 的总和,其中 position 小于我的 position 对于所有其他跑者。

问题:我如何使用 purr 以整洁的方式实现这一点。 我的目标是创建一个名为 beatenLengths 的新列,其中包含每个点、跑步者和 position 的值。

我的想法是尝试类似的事情,但我得到了任何地方:

df2 = df %>% 
  group_by(position) %>% 
  mutate(bl =if_else(position==1,0,map(lengthsAhead,someFunction)))

我试图在下面使用一个代表:

library(tidyverse)
#> Warning: package 'tidyverse' was built under R version 3.5.3
#> Warning: package 'ggplot2' was built under R version 3.5.3
#> Warning: package 'tidyr' was built under R version 3.5.3
#> Warning: package 'readr' was built under R version 3.5.3
#> Warning: package 'purrr' was built under R version 3.5.3
#> Warning: package 'dplyr' was built under R version 3.5.3
#> Warning: package 'stringr' was built under R version 3.5.3
#> Warning: package 'forcats' was built under R version 3.5.3

df = tibble(point = c(1, 1,1,1,2,2,2,2),
            position=c(1,2,3,4,1,2,3,4),
            runners = c("John","Bill", "Sam", "Sally","John","Bill", "Sally", "Sam"),
            lengthsAhead = c(0.25,0.75,2.0,0,2.25,1.75,3.0,0))

df
#> # A tibble: 8 x 4
#>   point position runners lengthsAhead
#>   <dbl>    <dbl> <chr>          <dbl>
#> 1     1        1 John            0.25
#> 2     1        2 Bill            0.75
#> 3     1        3 Sam             2   
#> 4     1        4 Sally           0   
#> 5     2        1 John            2.25
#> 6     2        2 Bill            1.75
#> 7     2        3 Sally           3   
#> 8     2        4 Sam             0

我认为您需要在每个point而不是position进行分组。 您可以尝试获取cumsumlengthsAhead并减去当前的lengthsAhead值以获得殴打长度。

library(dplyr)

df %>% 
  group_by(point) %>% 
  mutate(bl = cumsum(lengthsAhead) - lengthsAhead)

#  point position runners lengthsAhead    bl
#  <dbl>    <dbl> <chr>          <dbl> <dbl>
#1     1        1 John            0.25  0   
#2     1        2 Bill            0.75  0.25
#3     1        3 Sam             2     1   
#4     1        4 Sally           0     3   
#5     2        1 John            2.25  0   
#6     2        2 Bill            1.75  2.25
#7     2        3 Sally           3     4   
#8     2        4 Sam             0     7   

base R中,我们可以做

df$bl <- with(df, ave(lengthsAhead, point, FUN = cumsum) - lengthsAhead)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM