R语言 难以正确清理薪资数据(生成NA)

wz8daaqr  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(87)

我试图清理下面的tibble工资栏:
| 最低工资|最高工资|
| --|--|
| 65K| 75K|
| 65K| 75K|
| 65K| 75K|
| 56.3K | 90.8K |
| 61.7K |105K|
| 四万五千三百六十|八万四千二百四十|
我不知道如何使上述两个工资列的方式,只有数字(没有标点符号,没有“K”字符)。
我尝试了三种不同的方法。这三种情况的结果都一样。

1)

yearly %>%
        mutate(min_salary = case_when(grepl("K", min_salary) ~ 
        as.numeric(gsub("[^0-9.]", "", min_salary)) * 1000, TRUE ~ 
        as.numeric(min_salary)), 
        max_salary = case_when( grepl("K", max_salary) ~ 
        as.numeric(gsub("[^0-9.]", "", max_salary)) * 1000, TRUE ~ 
        as.numeric(max_salary)
        )
         )

2)

yearly %>%
        mutate( min_salary = ifelse(grepl("K", min_salary), 
        as.numeric(gsub("[^0-9.]", "", min_salary)) * 1000, 
        as.numeric(min_salary)),
        max_salary = ifelse(grepl("K", max_salary), as.numeric(gsub(" 
        [^0-9.]", "", max_salary)) * 1000, as.numeric(max_salary)))

3)

yearly %>%
    mutate(min_salary = ifelse(str_detect(min_salary, "K"),
    as.numeric(gsub("[^0-9.]", "", min_salary)) * 1000,
    as.numeric(min_salary)),
    max_salary = ifelse(str_detect(max_salary, "K"),
    as.numeric(gsub("[^0-9.]", "", max_salary)) * 1000,
    as.numeric(max_salary)))

结果

一声轻喝:
| 最低工资|最高工资|
| --|--|
| 65000 | 75000 |
| 65000 | 75000 |
| 65000 | 75000 |
| 56300 | 90800 |
| 61700 | 105000 |
| NA| NA|
查看更多行使用print(n = ...)查看更多行警告消息:mutate()中有2个警告。第一个警告是:在论证中:min_salary = ifelse(...)。由于ifelse()中的警告引起:强制引入的!NA运行dozr::last_dozr_warnings()以查看剩余的1个警告。
我怎么能不生成“NA”?NA行是原始组中没有“K”的行。

w1e3prcc

w1e3prcc1#

您可以创建一个快速帮助函数,然后将其应用于列。我添加了tidyverse和base R选项:
示例数据

yearly <- read.table(text = "min_salary max_salary
65K 75K
65K 75K
65K 75K
56.3K   90.8K
61.7K   105K
45,360  84,240", header = TRUE)

代码:

# tidy verse approach
quickfun <- function(x){
  yy <- readr::parse_number(x)
  ifelse(stringr::str_detect(x, "K"), yy*1e3, yy)
}

# in base R
quickfun_base <- function(x){
  yy <- as.numeric(gsub("\\D", "", x))
  ifelse(grepl("K", x), yy*1e3, yy)
}

将其应用于dplyr/magrittr链:

yearly %>%
  mutate(across(c(min_salary, max_salary), ~quickfun(.x)))

#  min_salary max_salary
# 1      65000      75000
# 2      65000      75000
# 3      65000      75000
# 4      56300      90800
# 5      61700     105000
# 6      45360      84240

在基R中使用lapply

yearly[c("min_salary","max_salary")] <- lapply(yearly[c("min_salary","max_salary")], quickfun)

#  min_salary max_salary
# 1      65000      75000
# 2      65000      75000
# 3      65000      75000
# 4      56300      90800
# 5      61700     105000
# 6      45360      84240

相关问题