Хобрук: Ваш путь к мастерству в программировании

Как использовать map2 с векторами неравной длины

Эта проблема

Я пытаюсь рассчитать подоходный налог с доходов от 1 до 200 000 долларов с шагом 100 долларов (2000 значений).

Я собрал информацию о налоговых ставках, в результате чего получился список из 34 фреймов данных.

У меня есть функция, которая рассчитывает подлежащий уплате налог на основе дохода и применимых ставок.

Используя эту функцию, я хочу создать вектор, показывающий подлежащий уплате налог:

  1. для каждого уровня дохода (2000 значений)
  2. за каждый набор (34 набора ставок)

Было бы здорово, если бы я мог вернуть этот вывод во фрейме данных / тибле.

Данные

#This scrapes the website of the tax administrator and returns a list of tidy data frames showing tax rates for income years between 2016 and 1983
url <- "https://www.ato.gov.au/Rates/Individual-income-tax-for-prior-years/"
pit_sch <- url %>%
  read_html() %>%
  html_table() %>%
  setNames(., url %>%
             read_html() %>%
             html_nodes("caption") %>%
             html_text()) %>% 
  map(.%>%
    mutate(`Tax on this income` = gsub(",", "", `Tax on this income`), 
            cumm_tax_amt = str_extract(`Tax on this income`, "(?<=^\\$)\\d+") %>% as.numeric(), 
            tax_rate = str_extract(`Tax on this income`, "\\d+.(\\d+)?(?=(\\s+)?c)") %>% as.numeric(), 
            threshold = str_extract(`Tax on this income`, "(?<=\\$)\\d+$") %>% as.numeric()
           )
    ) %>%
  map(~drop_na(.x, threshold)) %>% 
  map(function(x) { mutate_each(x, funs(replace(., is.na(.), 0))) })

#Defining income 
income <- seq(from = 1, to = 200000, by = 100)

#The function for calculating tax payable
tax_calc <- function(data, income) {
  i <-tail(which(income >= data[, 5]), 1)
  if (length(i) > 0) 
    return(((income - data[i,5]) * (data[i,4]/100)) + data[i,3])
  else
    return(0)
}

Моя попытка

> map2(pit_sch, income, tax_calc)
Error: Mapped vectors must have consistent lengths:
* `.x` has length 34
* `.y` has length 2000
    enter code here
04.06.2019

  • Как предполагала ошибка, вам нужно, чтобы оба элемента имели одинаковую длину map2 или Map (из baser R) работает с соответствующими элементами списков или векторов, поэтому, если длина отличается, это вызывает ошибку, поскольку ожидается, что оба будут одинаковой длины 04.06.2019

Ответы:


1

Чтобы правильно различать разные income и годы, для которых это рассчитано. Я бы посоветовал позволить функции tax_calc возвращать tibble с вычислением income и tax.

library(tidyverse)

tax_calc <- function(data, income) {
   i <-tail(which(income >= data[, 5]), 1)
  if (length(i) > 0) 
    return(tibble(income = income, 
          tax = (income - data[i,5]) * (data[i,4]/100) + data[i,3]))
  else
    return(tibble(income = income, tax = 0))
}

Поскольку вы хотите tax_calc для всех income для каждого pit_sch, вы можете использовать

map(pit_sch,~map_df(income, tax_calc, data = .)) %>%  bind_rows(., .id = "id")

Проверяя его на tail(income), получаем

map(pit_sch,~map_df(tail(income), tax_calc, data = .)) %>%  bind_rows(., .id = "id")

# A tibble: 204 x 3
#   id                             income    tax
#   <chr>                           <dbl>  <dbl>
# 1 Resident tax rates for 2016-17 199401 62962.
# 2 Resident tax rates for 2016-17 199501 63007.
# 3 Resident tax rates for 2016-17 199601 63052.
# 4 Resident tax rates for 2016-17 199701 63097.
# 5 Resident tax rates for 2016-17 199801 63142.
# 6 Resident tax rates for 2016-17 199901 63187.
# 7 Resident tax rates for 2015-16 199401 63277.
# 8 Resident tax rates for 2015-16 199501 63322.
# 9 Resident tax rates for 2015-16 199601 63367.
#10 Resident tax rates for 2015-16 199701 63412.
# … with 194 more rows
04.06.2019
Новые материалы

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

LeetCode Проблема 41. Первый пропущенный положительный результат
LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

Расистский и сексистский робот, обученный в Интернете
Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

Управление состоянием в микрофронтендах
Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

Структуры данных в C ++ - Часть 1
Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

Как я опубликовал свое первое приложение в App Store в 13 лет
Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..