拆分工资范围
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
将是您的 IncomeLowerRange
,col2
将是您的 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
我正在尝试将第一列范围拆分为两个单独的列
我试过以下代码:
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
将是您的 IncomeLowerRange
,col2
将是您的 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