我無法解決以下問題。
假設以下資料:
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
uj5u.com熱心網友回復:
你基本上是在正確的方向。由于您為 提供了一個.init值accumulate,因此結果向量的大小為n 1,第一個值為.init。您必須洗掉第一個值才能獲得適合您的列大小的向量。
然后,如果您想要剩余值的 NA,這是一種方法。此外,由于“起始行”是第三行,.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
uj5u.com熱心網友回復:
@tmfmnk提供了一個很棒的答案,他們應該得到充分的信任(不是我)
下面是他們評論中的相同代碼(為了提高可見性,同時還設定了一個初始值)
init_value = 10 df = df %>% mutate(test = lag(value)) %>% group_by(source) %>% mutate(test = init_value cumsum(add))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/412464.html
標籤:
上一篇:匹配串列中資料框列中的單詞
下一篇:熊貓資料框中的簡單聚類
