Как сделать эту простую функцию более эффективной? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть данные о заработной плате, и около 95% из них приведены в почасовом формате, однако некоторые из них приведены в виде годовой заработной платы. Поэтому я сделал функцию для преобразования годовой заработной платы в почасовую, однако это занимает 1 минуту 40 секунд, когда мой набор данных составляет 43000 строк x 12 столбцов (что, я не думал, будет слишком большим), поэтому я не думал, что это займет это долго

Мне любопытно, есть ли лучший способ сделать это, чем текущая функция, которую я создал. Я новичок в dplyr и tidyverse, так что в идеале я отвечу, используя эти возможности.

Вот некоторые примеры данных:

NOC4  Region Region_Name Wage_2012 Wage_2013 Wage_2014   
0011  ER10   National    28.1      65000     NA       
0011  ER1010 Northern    NA        30.5      18       
0011  ER1020 Southern    42.3      72000     22       
0011  ER1030 Eastern     12        NA        45500    
0011  ER1040 Western     8         NA        99000    
0011  ER10   National    NA        65000     NA  

Вот как это должно выглядеть после функции:

NOC4  Region Region_Name Wage_2012 Wage_2013 Wage_2014   
0011  ER10   National    28.1      33.33     NA       
0011  ER1010 Northern    NA        30.5      18       
0011  ER1020 Southern    42.3      36.92     22       
0011  ER1030 Eastern     12        NA        23.33    
0011  ER1040 Western     8         NA        50.77    
0011  ER10   National    NA        33.33     NA  

Вот функция:

year_to_hour <- function(dataset, salary, startcol){
  # where "startcol" should be the first column containing the numeric
  # values that you are trying to convert. 
  for(i in startcol:ncol(dataset)){

    for(j in 1:nrow(dataset)){

      if(is.na(dataset[j, i])){

        j = j+1

      }else if(as.numeric(dataset[j, i]) >= as.numeric(salary)){

        dataset[j, i] = dataset[j, i]/1950
      }
      else{

        dataset[j, i] = dataset[j, i]

      }

    }

  }

  return(as_tibble(dataset))

}

converted <- year_to_hour(wage_data_messy, 1000, 4)

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Используя dplyr Я бы использовал mutate_if

salary <- 1000
df %>% mutate_if(is.numeric, ~ifelse(. > salary, ./1950, .))
1 голос
/ 29 мая 2019

R будет работать намного быстрее, если вы позволите ему обрабатывать циклы под капотом через «векторизованный» код.

http://www.noamross.net/blog/2014/4/16/vectorization-in-r--why.html

Вот подход, использующий dplyr:

library(dplyr)
salary <- 1000
df %>%
  mutate_at(vars(Wage_2012:Wage_2014),          # For these columns...
            ~ . / if_else(. > salary, 1950, 1)) # Divide by 1950 if > salary
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...