R 如何使这个简单的函数更有效?

R 如何使这个简单的函数更有效?,r,performance,function,R,Performance,Function,我有关于工资的数据,其中95%是以小时工资的形式给出的,但有些是以年薪的形式给出的。所以我做了一个函数,将年薪转换为小时工资,但是运行需要1分钟40秒,当我的数据集是43000行x 12列(我不认为这会太大)时,所以我不认为需要这么长时间 我很好奇是否有比我创建的当前函数更好的方法来实现这一点。我是dplyr和tidyverse的新手,因此理想的答案是使用这些功能 以下是一些示例数据: NOC4 Region Region_Name Wage_2012 Wage_2013 Wage_2014

我有关于工资的数据,其中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)
以下是函数:

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)
year\u to\u hour=as.numeric(工资)){
数据集[j,i]=数据集[j,i]/1950
}
否则{
数据集[j,i]=数据集[j,i]
}
}
}
返回(作为可存储(数据集))
}

如果你让转换后的R通过“矢量化”代码处理引擎盖下的循环,它将工作得更快

这里有一种使用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
库(dplyr)
工资%
在(VAR(工资2012年:工资2014年)处进行变异,#对于这些列。。。
~./if_else(.>salary,1950,1))#除以1950 if>salary

R如果您让它通过“矢量化”代码处理引擎盖下的循环,它将工作得更快

这里有一种使用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
库(dplyr)
工资%
在(VAR(工资2012年:工资2014年)处进行变异,#对于这些列。。。
~./if_else(.>salary,1950,1))#除以1950 if>salary

使用
dplyr
如果

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

使用
dplyr
如果

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

对于
NA
值,第一个
if
是什么意思?它似乎对输出没有影响。老实说,我只是在某一点上不断地出错,这让一些错误消失了。但是我相信你是对的,这是没有用的。对于
NA
值,第一个
if
是什么意思?它似乎对输出没有影响。老实说,我只是在某一点上不断地出错,这让一些错误消失了。我相信你是对的,但是这是没有用的。