![](/img/trans.png)
[英]How can I use Purr or other functions from the Tidyverse to refactor this script?
[英]How would I recursively add values in a tibble using purr in the tidyverse
我是 R 和 tidyverse 的新手,我试图了解如何使用 purrr 递归添加。
我有一个由 8 行和 4 列组成的小标题。 tibble 中的数据代表比赛中两点的跑步者。 列如下:
我想计算被击败的长度,定义为第一名跑步者后面的长度数。 例如,对于第一名的跑者来说,打过的长度将为 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
进行分组。 您可以尝试获取cumsum
的lengthsAhead
并减去当前的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.