Корректировка промежуточных итогов в необработанных данных - PullRequest
0 голосов
/ 08 июня 2018

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

В кадре данных показаны запрошенные и утвержденные суммы для каждого элемента.

Разрешенная сумма иногда больше или меньше запрашиваемой суммы.Когда это происходит, корректировки (с пояснительным текстом, не включенным здесь) отображаются в скобках ниже итоговой суммы.

Например, в приведенном ниже кадре данных авторизаторы корректировали запрошенную сумму для элемента "a" (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 ]

0 голосов
/ 08 июня 2018

Нам нужно сделать

library(dplyr)
library(readr)
df %>%
    mutate(authorized_amount = case_when(!is.na(requested_amount) ~ 
                      requested_amount, 
             TRUE ~ parse_number(authorized_amount))
0 голосов
/ 08 июня 2018

Если я правильно понял, вам нужна сумма 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...