将系数转换为R中的数值

将系数转换为R中的数值,r,categorical-data,R,Categorical Data,我在R中有工资范围的系数,其形式为$100001-$150000,超过$150000,$25000,等等。我希望将这些系数转换为数值(例如,将系数$100001-$150000转换为整数125000) 类似地,我也有一些教育类别,如高中文凭,当前本科生,博士,我想给这些类别分配数字(例如,给博士一个比高中文凭更高的值) 给定包含这些值的数据帧,如何执行此操作?用于转换货币 # data df <- data.frame(sal = c("$100,001 - $150,000" , "ov

我在R中有工资范围的系数,其形式为
$100001-$150000
超过$150000
$25000
,等等。我希望将这些系数转换为数值(例如,将系数
$100001-$150000
转换为整数125000)

类似地,我也有一些教育类别,如
高中文凭
当前本科生
博士
,我想给这些类别分配数字(例如,给
博士
一个比
高中文凭
更高的值)


给定包含这些值的数据帧,如何执行此操作?

用于转换货币

# data
df <- data.frame(sal = c("$100,001 - $150,000" , "over $150,000" , 
    "$25,000"), educ = c("High School Diploma", "Current Undergraduate",
   "PhD"),stringsAsFactors=FALSE)

 # Remove comma and dollar sign
temp <- gsub("[,$]","", df$sal)

# remove text
temp <- gsub("[[:alpha:]]","", temp)

# get average over range
df$ave.sal <- sapply(strsplit(temp , "-") , function(i) mean(as.numeric(i)))
#数据

df我只需要做一个值向量,映射到因子的级别,并将它们映射到。下面的代码是一个远不如我所希望的优雅的解决方案,因为我不知道如何使用向量进行索引,但是如果您的数据不是非常大的话,这将完成这项工作。假设我们要将
事实
的因子元素映射到
VAL
中的数字:

fact<-as.factor(c("a","b","c"))
vals<-c(1,2,3)

#for example:
vals[levels(fact)=="b"]
# gives: [1] 2

#now make an example data frame:
sample(1:3,10,replace=T)
data<-data.frame(fact[sample(1:3,10,replace=T)])
names(data)<-c("myvar")

#our vlookup function:
vlookup<-function(fact,vals,x) {
    #probably should do an error checking to make sure fact 
    #   and vals are the same length

    out<-rep(vals[1],length(x)) 
    for (i in 1:length(x)) {
        out[i]<-vals[levels(fact)==x[i]]
    }
    return(out)
}

#test it:
data$myvarNumeric<-vlookup(fact,vals,data$myvar)

fact您可以在
car
软件包中使用recode功能

例如:

library(car)
df$salary <- recode(df$salary, 
    "'$100,001 - $150,000'=125000;'$150,000'=150000")
库(车)

df$salary@Stat:我不清楚如何将每个因素映射到我为其选择的数字。是的,我认为这对这种情况没有帮助,我现在正在努力寻找一个快速的答案。我想在两列中都有一些
因素缺失。有没有一种方法可以修改上面的内容来做到这一点;请参见编辑-缺少的值应仍然可以。如果没有,你可以编辑你的问题并发布一些数据/示例数据;我想这会管用的<代码>事实
df
 #                 sal                  educ  ave.sal educ.f
# 1 $100,001 - $150,000                  <NA> 125000.5     NA
# 2       over $150,000   High School Diploma 150000.0      1
# 3             $25,000 Current Undergraduate  25000.0      2
# 4                <NA>                   PhD       NA      3
fact<-as.factor(c("a","b","c"))
vals<-c(1,2,3)

#for example:
vals[levels(fact)=="b"]
# gives: [1] 2

#now make an example data frame:
sample(1:3,10,replace=T)
data<-data.frame(fact[sample(1:3,10,replace=T)])
names(data)<-c("myvar")

#our vlookup function:
vlookup<-function(fact,vals,x) {
    #probably should do an error checking to make sure fact 
    #   and vals are the same length

    out<-rep(vals[1],length(x)) 
    for (i in 1:length(x)) {
        out[i]<-vals[levels(fact)==x[i]]
    }
    return(out)
}

#test it:
data$myvarNumeric<-vlookup(fact,vals,data$myvar)
library(car)
df$salary <- recode(df$salary, 
    "'$100,001 - $150,000'=125000;'$150,000'=150000")