【问题标题】:How would I recursively add values in a tibble using purr in the tidyverse我如何在 tidyverse 中使用 purr 递归地在 tibble 中添加值
【发布时间】:2019-11-17 13:42:28
【问题描述】:

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

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

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

我想计算打过的长度,定义为第一名之后的长度。例如,第一名的跑步者的节拍长度将为 0,并且将是 lengthsAhead 的总和,其中位置小于我对所有其他跑步者的位置。

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

我的想法是尝试类似的事情,但我成功了:

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

【问题讨论】:

  • @IceCreamToucan - 是的,这正是我想要的。我想我不需要使用 purrr 或自定义函数。谢谢你。您要正式回答这个问题吗?

标签: r dplyr purrr


【解决方案1】:

我认为您需要在每个 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   

【讨论】:

    【解决方案2】:

    base R,我们可以做

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-29
      • 2020-01-27
      • 2021-04-25
      • 2021-07-13
      • 2013-01-15
      • 1970-01-01
      • 2020-09-26
      • 2018-02-13
      相关资源
      最近更新 更多