r - 以累积方式在数据框列表中建立一个值
问题描述
数据框列表:
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.788348
。cumsum_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 的每个实例的滞后?
解决方案
尽管这不如 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
推荐阅读
- c++ - 如何在没有qmake依赖的情况下制作Qt生成的makefile
- jquery - $("p:first"); VS document.querySelector("p");
- r - R闪亮从相同的输出函数中检索表并在ui中并排显示
- laravel-5.2 - 将对象数组转换为整数数组
- javascript - 在 wicked_pdf 中编号非 1 的页面
- sql - dbGetQuery 检索的行数较少
- java - Java Websocket 在向同一个套接字发出下一个请求之前等待响应
- ruby-on-rails-5 - 在rails api中显示不带括号的错误消息
- node.js - 如何使用 node.js 从两个不同的数据库系统中检索数据?
- ssl-certificate - 如何将签名证书添加到现有的 Google Cloud vm