Quantcast
Channel: Active questions tagged r - Stack Overflow
Viewing all articles
Browse latest Browse all 201839

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

$
0
0

I'm new to R and the tidyverse and I'm trying to understand how purrr could be used to add recursively.

I have a tibble comprised of 8 rows and 4 columns. The data in the tibble represents runners at two points in the a race. The columns are as follows:

  • point - point in race (ie 1/2 way and finish)
  • position - what place the runner is in the race at that point
  • runners - runners name
  • lengthsAhead - how many length ahead a runner is ahead of the next runner

I want to calculate beaten lengths, defined as the number of lengths behind the first place runner. For example, beaten lengths would be 0 for the first place runner and would be the sum of lengthsAhead where position is less than my position for all other runners.

Question: How would I achieve this in a tidy way using purr. My goal is to have a tibble with a new column called beatenLengths with value for each point, runners and position.

My thought was to attempt something similar to this, but I was getting anywhere:

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

I have attempted to use a reprex below:

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

Viewing all articles
Browse latest Browse all 201839

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>