我想不出下面的问题。
假设折叠数据:
library(tidyverse)
df <- tibble(source = c("A", "A", "B", "B", "B", "C"),
value = c(5, 10, NA, NA, NA, 20),
add = c(1, 1, 1, 2, 3, 4))我想要做的是:对于所有source == "B"的情况,我想要计算上一行的value和当前行的add的累积和。当然,对于第一个"B“行,我需要为value提供一个起始值。注意:在这种情况下,如果我们只取最后一个"A“行的值就可以了。
因此,对于第3行,结果是10 +1= 11。
对于第4行,结果为11 +2= 13。
对于第5行,结果为13 +3= 16。
我试图使用purrr::accumulate,但在许多不同的方面都失败了,例如我认为我可以做到:
df %>%
mutate(test = accumulate(add, .init = 10, ~.x + .y))但这会导致错误:
Error: Problem with `mutate()` column `test`.
i `test = accumulate(add, .init = 10, ~.x + .y)`.
i `test` must be size 6 or 1, not 7.如果我使用.init = value,也一样
而且,我也没有设法只在B组中完成这项工作(虽然这可能不是问题,但我认为我可能可以在完整的数据框架上执行表单,然后只替换所有非B行的值)。
预期产出:
# A tibble: 6 x 4
source value add test
<chr> <dbl> <dbl> <dbl>
1 A 5 1 NA
2 A 10 1 NA
3 B NA 1 11
4 B NA 2 13
5 B NA 3 16
6 C 20 4 NA发布于 2022-01-14 13:09:29
你基本上是在正确的方向上。由于您向.init提供了一个accumulate值,因此得到的向量大小为n+1,第一个值为.init。您必须删除第一个值才能得到适合您的列大小的向量。
然后,如果您希望在剩余的值上使用NAs,下面是一种方法。另外,由于“起始行”是第三行,所以必须将.init设置为8。
df %>%
mutate(test =
ifelse(source == "B", accumulate(add, .init = 8, ~.x + .y)[-1], NA))
# A tibble: 6 x 4
source value add test
<chr> <dbl> <dbl> <dbl>
1 A 5 1 NA
2 A 10 1 NA
3 B NA 1 11
4 B NA 2 13
5 B NA 3 16
6 C 20 4 NA发布于 2022-01-14 12:56:32
@tmfmnk给出了一个很棒的答案,他们应该得到完全的信任(而不是我)
下面是它们注释中的相同代码(为了获得更多的可见性,同时还设置了一个初始值)
init_value = 10 df = df %>%变异(test=滞后(值)) %>% group_by(源) %>%变异(test= init_value +累积量(Add))
https://stackoverflow.com/questions/70710345
复制相似问题