将系数转换为R中的数值
我在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
$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")