Корректировка промежуточных итогов в необработанных данных

Это типичная проблема для аналитиков бюджета Конгресса, работающих с грязными данными.

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
Другие вопросы по тегам