我正在尝试将第一列范围拆分为两个单独的列,如此
我尝试过以下代码:
testDF$IncomeLowerRange <- strsplit(gsub("[^-]+-", "", testDF$IncomeRange), ";")[1]
testDF$IncomeUpperRange <- strsplit(gsub("[^-]+-", "", testDF$IncomeRange), ";")[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
将是您的IncomeLowerRange
而col2
将是您的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