首页 > 解决方案 > 以累积方式在数据框列表中建立一个值

问题描述

数据框列表:

mylist <- diamonds %>% 
  mutate(somenum = rnorm(nrow(.))) %>% 
  group_by(cut, color) %>% 
  group_split %>% 
  map(~ list(dta = ., initial_val = rnorm(1)))

例如 mylist 中的第一项:

mylist[1]
[[1]]
[[1]]$dta
# A tibble: 163 x 11
   carat cut   color clarity depth table price     x     y     z somenum
   <dbl> <ord> <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>   <dbl>
 1  0.75 Fair  D     SI2      64.6    57  2848  5.74  5.72  3.7    0.302
 2  0.71 Fair  D     VS2      56.9    65  2858  5.89  5.84  3.34   0.500
 3  0.9  Fair  D     SI2      66.9    57  2885  6.02  5.9   3.99   0.179
 4  1    Fair  D     SI2      69.3    58  2974  5.96  5.87  4.1    1.25 
 5  1.01 Fair  D     SI2      64.6    56  3003  6.31  6.24  4.05  -0.731
 6  0.73 Fair  D     VS1      66      54  3047  5.56  5.66  3.7    0.758
 7  0.71 Fair  D     VS2      64.7    58  3077  5.61  5.58  3.62  -1.43 
 8  0.91 Fair  D     SI2      62.5    66  3079  6.08  6.01  3.78   0.820
 9  0.9  Fair  D     SI2      65.9    59  3205  6     5.95  3.94  -1.81 
10  0.9  Fair  D     SI2      66      58  3205  6     5.97  3.95  -0.179
# … with 153 more rows

[[1]]$initial_val
[1] 1.788348

列表项包含一个数据框以及一个数字“initial_val”。

对于列表中的每个数据框,我想在其上变异一个新字段“cumsum_someval”,该字段以列表项的 initial_val 开头,然后通过将 initial_val 的滞后累积和与 somenum 的行条目添加来“构建它” . 例如,第一行的值cumsum_someval就是 initial_val 1.788348cumsum_someval但应该是第二排1.788348 + 0.302 = 2.090348。然后,第 3 行将是2.090348 + 0.500 = 2.590348. 等等。

也许类似于purrr::map沿线的自定义功能......?

myfun <- function(dta, initial_val) {
  cum_val = initial_val + dta$somenum[<rownumber here>]
}

接受建议。

对于 mylist 中的每个数据帧,我如何构建这个以 initial_val 开头的新变异字段,然后继续求和 somenum 的每个实例的滞后?

标签: rdplyrpurrr

解决方案


尽管这不如 Arun 的解决方案优雅,但我将把它献给他,也献给 Doug,因为他不时向我们提出非常好的挑战:

library(purrr)

mylist %>%
  map_dbl("initial_val") %>%
  map2(mylist, function(a, b) {
    b %>% imap(~ if(.y == "dta") {
      .x %>% mutate(cumsum_someval = accumulate(c(a, .x$somenum[-nrow(.x)]), `+`))
    } else {
      .x
    })
  }) %>% `[`(1)

[[1]]
[[1]]$dta
# A tibble: 163 x 12
   carat cut   color clarity depth table price     x     y     z somenum cumsum_someval
   <dbl> <ord> <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>   <dbl>          <dbl>
 1  0.75 Fair  D     SI2      64.6    57  2848  5.74  5.72  3.7   0.0684         0.0391
 2  0.71 Fair  D     VS2      56.9    65  2858  5.89  5.84  3.34  0.436          0.108 
 3  0.9  Fair  D     SI2      66.9    57  2885  6.02  5.9   3.99 -0.0591         0.543 
 4  1    Fair  D     SI2      69.3    58  2974  5.96  5.87  4.1   1.08           0.484 
 5  1.01 Fair  D     SI2      64.6    56  3003  6.31  6.24  4.05 -0.478          1.57  
 6  0.73 Fair  D     VS1      66      54  3047  5.56  5.66  3.7  -0.600          1.09  
 7  0.71 Fair  D     VS2      64.7    58  3077  5.61  5.58  3.62 -0.825          0.487 
 8  0.91 Fair  D     SI2      62.5    66  3079  6.08  6.01  3.78 -1.09          -0.338 
 9  0.9  Fair  D     SI2      65.9    59  3205  6     5.95  3.94 -0.672         -1.42  
10  0.9  Fair  D     SI2      66      58  3205  6     5.97  3.95 -0.273         -2.10  
# ... with 153 more rows

[[1]]$initial_val
[1] 0.03913573

推荐阅读