【问题标题】:How to make this simple function more efficient?如何让这个简单的功能更高效?
【发布时间】:2019-05-29 19:01:22
【问题描述】:

我有工资数据,其中大约 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)

【问题讨论】:

  • 第一个if,对于NA 值,意味着什么?它似乎对输出没有影响。
  • 老实说,我只是在某一时刻不断收到错误,这让其中一些错误消失了。我相信你是对的,但它是没用的。

标签: r performance function


【解决方案1】:

如果你让它通过“矢量化”代码处理引擎盖下的循环,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

【讨论】:

    【解决方案2】:

    使用dplyr 我会使用mutate_if

    salary <- 1000
    df %>% mutate_if(is.numeric, ~ifelse(. > salary, ./1950, .))
    

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 2015-09-23
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多