Извинения за заголовок, правки для ясности приветствуются.У меня есть какая-то таблица, которая выглядит следующим образом, с несколькими случаями и переменной all
для каждого случая, а также переменной B2
.Случаи имеют такую иерархию, что здесь B
означает все B
, которые не A
, так что all
сумм до 100. Я хочу включить дополнительный случай B2
между B
и C
который следует этому шаблону.
library(tidyverse)
tbl <- tribble(
~case, ~all, ~B2,
"A", 10, 5,
"B", 20, 7,
"C", 30, 10,
"D", 40, 15
)
Вот желаемый результат.Обратите внимание, что значение для случая B2
равно 25, что составляет 10 + 15 из таблицы выше.Эти значения были соответственно вычтены из случаев C
и D
.
tbl_out <- tribble(
~case, ~all,
"A", 10,
"B", 20,
"B2", 25,
"C", 20,
"D", 25,
)
Вот моя очень грязная попытка получить желаемый результат.Я чувствую, что должен быть какой-то способ лучше кодировать «иерархию» в случаях (путем сортировки?) Вместо того, чтобы вручную указывать preceding
и связывать таблицы вместе.Любые предложения?
tbl %>%
mutate(
preceding = case %in% c("A", "B"),
new_vals = if_else(preceding, all, all - B2)
) %>%
bind_rows(
group_by(., preceding) %>%
summarise(case = "B2", new_vals = sum(B2))
) %>%
filter(!is.na(B2) | preceding == FALSE) %>%
select(case, new_vals) %>%
arrange(case)
#> # A tibble: 5 x 2
#> case new_vals
#> <chr> <dbl>
#> 1 A 10
#> 2 B 20
#> 3 B2 25
#> 4 C 20
#> 5 D 25
Создано в 2019-03-25 пакетом Представить (v0.2.1)