有没有一个R函数来清理字符格式的混乱工资



我有一列杂乱的工资数据。我想知道是否有一个包具有专门用于清理这种混乱数据的功能。我的数据看起来像:

data.frame(salary = c("40,000-60,000", "40-80K", "$100,000", 
"$70/hr", "Between $65-80/hour", "$100k",
"50-60,000 a year", "90"))
#>                salary
#> 1       40,000-60,000
#> 2              40-80K
#> 3            $100,000
#> 4              $70/hr
#> 5 Between $65-80/hour
#> 6               $100k
#> 7    50-60,000 a year
#> 8                  90

由reprex包(v0.3.0(创建于2020-12-16

我希望clean列是年度级别的数字。我知道如何手动清理此列,我只是想知道是否有其他包可以帮助(除了readr::parse_number()(

预期输出如下所示:

#>   output
#> 1  50000
#> 2  60000
#> 3 100000
#> 4 145600
#> 5 150800
#> 6 100000
#> 7  55000
#> 8  90000

以下是您可以尝试的一些第一步。我定义了两个函数:一个用三个零代替kK。如果一个数字以千表示,而另一个数字不是,则另一个会添加前导零。

rem_k <- function(x) {
sub("(\d)[kK]", "\1,000", x)
}
add_zero <- function(x) {
ifelse(grepl("[1-9]0\-\d[0,]{2,}", x), sub("([1-9]0)(\-\d[0,]{2,})", "\1,000\2", x), x)
}

最后,我删除了所有非必要的字符:

df %>% 
mutate(salary2 = gsub("[^0-9,\-]", "", add_zero(rem_k(salary))))
salary       salary2
1       40,000-60,000 40,000-60,000
2              40-80K 40,000-80,000
3            $100,000       100,000
4              $70/hr            70
5 Between $65-80/hour         65-80
6               $100k       100,000
7    50-60,000 a year 50,000-60,000
8                  90            90

一个选项是创建一个仅包含数字和-的列"salary1",然后separate将其按-mutate将这些列的值分成两列,基于原始列中的子字符串匹配,即K|khr|hour,即将其与1000相乘(K|k(,或对于每小时,基于一年的小时数,用CCD_ 11得到这些列的CCD_

library(dplyr)
library(stringr)
library(tidyr)
df1 %>% 
mutate(salary1 = str_remove_all(salary, '[^0-9-]+')) %>% 
separate(salary1, into = c('salary1', 'salary2'), 
convert = TRUE, extra = 'drop') %>%
mutate(across(c(salary1, salary2),
~ case_when(str_detect(salary, "[Kk]") ~ . * 1000, 
str_detect(salary, 'hr|hour') ~ . * 40 * 4 * 12, 
nchar(.) < 5 ~ as.numeric(str_pad(., pad = '0', 
side = 'right', width = 5)),
TRUE ~ as.numeric(.)))) %>% 
transmute(output = rowMeans(select(., salary1, salary2), na.rm = TRUE))

-输出

#  output
#1  50000
#2  60000
#3 100000
#4 134400
#5 139200
#6 100000
#7  55000
#8  90000

最新更新