Корректировка промежуточных итогов в необработанных данных
Это типичная проблема для аналитиков бюджета Конгресса, работающих с грязными данными.
Dataframe показывает суммы, запрошенные и авторизованные для каждого элемента.
Утвержденная сумма иногда больше или меньше запрашиваемой суммы. Когда это происходит, корректировки (с пояснительным текстом, не включенным здесь) отображаются в скобках под общей суммой.
Например, в приведенном ниже кадре данных авторизаторы скорректировали запрашиваемую сумму для элемента "а" (80 requested) by +19 and +1
, После этих корректировок общая разрешенная сумма для "а" составила 100.
80 requested + (19 authorized + 1 authorized) = 100 total authorized.
Цель: я хотел бы скорректировать разрешенные суммы в скобках.
library(tidyverse)
## DATA
df <- tribble(
~item, ~requested_amount, ~authorized_amount,
"a", 80, "100", #< Total
"a", NA, "[19]", #< Adjustment from request
"a", NA, "[1]", #< Adjustment from request
"b", 300, "300", #< Total (no adjustment)
"c", 80, "70", #< Total
"c", NA, "[-10]" #< Adjustment from request
)
#> # A tibble: 6 x 3
#> item requested_amount authorized_amount
#> <chr> <dbl> <chr>
#> 1 a 80 100
#> 2 a NA [19]
#> 3 a NA [1]
#> 4 b 300 300
#> 5 c 80 70
#> 6 c NA [-10]
Желаемый результат будет рассматривать суммы в скобках как реальные корректировки:
разрешенная сумма за товар "a" = (80 + 19 + 1) = 100
#> item requested_amount authorized_amount
#> <chr> <dbl> <dbl>
#> 1 a 80 80 #< Together...
#> 2 a NA 19 #< these add...
#> 3 a NA 1 #< to 100 for item "a"
#> 4 b 300 300
#> 5 c 80 70
#> 6 c NA - 10
Создано в 2018-06-07 пакетом представлением (v0.2.0).
2 ответа
Нам нужно сделать
library(dplyr)
library(readr)
df %>%
mutate(authorized_amount = case_when(!is.na(requested_amount) ~
requested_amount,
TRUE ~ parse_number(authorized_amount))
Если я правильно понял, вам нужно, чтобы сумма authorized_amount
суммируется для каждого элемента. Одним из решений является:
library(tidyverse)
library(readr)
df %>%
mutate(authorized_amount = readr::parse_number(df$authorized_amount)) %>%
group_by(item) %>%
summarise(requested_amount = requested_amount[!is.na(requested_amount)],
authorized_amount = sum(authorized_amount))
# A tibble: 3 x 3
item requested_amount authorized_amount
<chr> <dbl> <dbl>
1 a 80.0 120
2 b 300 300
3 c 80.0 60.0