拆分工资范围

时间:2017-06-12 02:48:32

标签: r regex strsplit

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

enter image description here

我尝试过以下代码:

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

2 个答案:

答案 0 :(得分:1)

我不认为这有一个单行,因为你需要提取一些数据,在其他情况下完全或部分替换。

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

> test <- c("$25,000-49,000","Not displayed", "$100,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=="$100,000+"] <- "250,000"
> 
> df
            test    col1    col2
1 $25,000-49,000  25,000  49,000
2  Not displayed      NA      NA
3      $100,000+ 100,000 250,000

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

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

答案 1 :(得分:0)

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

IncomeRange <- c("$25,000-49,000","$50,000-74,999",
          "Not displayed","$25,000-49,000", "$100,000+",
          "$100,000+","$75,000-99,999")
df <- data.frame(IncomeRange)

# IncomeRange only has 5 levels
levels(df$IncomeRange)
[1] "$100,000+"      "$25,000-49,000" "$50,000-74,999"
[4] "$75,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 $25,000-49,000            25000            49000
2 $50,000-74,999            50000            74999
3  Not displayed             <NA>             <NA>
4 $25,000-49,000            25000            49000
5      $100,000+            1e+05           250000
6      $100,000+            1e+05           250000
7 $75,000-99,999            75000            99999