拆分工资范围

Split salary range

我正在尝试将第一列范围拆分为两个单独的列

我试过以下代码:

testDF$IncomeLowerRange <- strsplit(gsub("[^-]+-", "", testDF$IncomeRange), ";")[1]
testDF$IncomeUpperRange <- strsplit(gsub("[^-]+-", "", testDF$IncomeRange), ";")[2]

我认为这没有单行代码,因为您需要提取一些数据,在其他情况下全部或部分替换。

我建议为此使用一个简单的逻辑:

> test <- c(",000-49,000","Not displayed", "0,000+")
> df <- data.frame(test)
> df$col1 <- sub("^\$?([0-9,]+).*", "\1", df$test)
> df$col1[df$col1=="Not displayed"] <- "NA"
> df$col2 <- sub("^[^-]+-(.*)", "\1", df$test)
> df$col2[df$col2=="Not displayed"] <- "NA"
> df$col2[df$col2=="0,000+"] <- "250,000"
> 
> df
            test    col1    col2
1 ,000-49,000  25,000  49,000
2  Not displayed      NA      NA
3      0,000+ 100,000 250,000

其中 col1 将是您的 IncomeLowerRangecol2 将是您的 IncomeUpperRange

^\$?([0-9,]+).* 正则表达式用于从范围中提取第一个数字,并且 100,000 到第一列(^ 匹配字符串的开头,$? 匹配 1 或 0 个 $ 符号,([0-9,]+) 将数字和逗号捕获到保留的第 1 组中,其余部分(同样,所有在数字 - .* 之后)被删除。

假设级别数量有限(如您的示例所示),一个非常简单的解决方案可能如下

IncomeRange <- c(",000-49,000",",000-74,999",
          "Not displayed",",000-49,000", "0,000+",
          "0,000+",",000-99,999")
df <- data.frame(IncomeRange)

# IncomeRange only has 5 levels
levels(df$IncomeRange)
[1] "0,000+"      ",000-49,000" ",000-74,999"
[4] ",000-99,999" "Not displayed" 

df$IncomeLowerRange<-factor(df$IncomeRange,
                                labels =c(100000,25000,50000,75000,NA))
df$IncomeUpperRange<-factor(df$IncomeRange,
                            labels =c(250000,49000,74999,99999,NA))

输出

     IncomeRange IncomeLowerRange IncomeUpperRange
1 ,000-49,000            25000            49000
2 ,000-74,999            50000            74999
3  Not displayed             <NA>             <NA>
4 ,000-49,000            25000            49000
5      0,000+            1e+05           250000
6      0,000+            1e+05           250000
7 ,000-99,999            75000            99999