Преобразование коэффициентов в числовые значения в R

У меня есть коэффициенты в R, которые представляют собой диапазоны заработной платы в форме $100,001 - $150,000, over $150,000, $25,000 и т.д., и я хотел бы преобразовать их в числовые значения (например, преобразование коэффициента $100,001 - $150,000 в целое число 125000).

Точно так же у меня есть образовательные категории, такие как High School Diploma, Current Undergraduate, PhD и т. Д., Которым я хотел бы присвоить числа (например, присвоить PhD более высокое значение, чем High School Diploma).

Как мне это сделать, учитывая фрейм данных, содержащий эти значения?


person orome    schedule 15.04.2014    source источник
comment
@Stat: Из этого мне непонятно, как сопоставить каждый фактор с числом, которое я для него выбрал.   -  person orome    schedule 16.04.2014
comment
Я не думаю, что это поможет в данной ситуации, сейчас я работаю над быстрым ответом.   -  person    schedule 16.04.2014


Ответы (3)


Для конвертации валюты

# 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$educ.f <- as.numeric(factor(df$educ , levels=c("High School Diploma" ,
          "Current Undergraduate", "PhD")))


df
#                  sal                  educ  ave.sal educ.f
# 1 $100,001 - $150,000   High School Diploma 125000.5      1
# 2       over $150,000 Current Undergraduate 150000.0      2
# 3             $25,000                   PhD  25000.0      3



ИЗМЕНИТЬ

Отсутствие значений / NA не имеет значения

# Data that includes missing values

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

Повторите приведенные выше команды, чтобы получить

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
person user20650    schedule 15.04.2014
comment
У меня также есть несколько "" факторов в обоих столбцах, которые я хотел бы рассматривать как отсутствующие. Есть ли способ изменить приведенное выше для этого? - person orome; 16.04.2014
comment
@raxacoricofallapatorius; См. Редактирование - пропущенные значения все равно должны быть в порядке. Если нет, вы можете отредактировать свой вопрос и опубликовать некоторые из ваших данных / примеров данных. - person user20650; 16.04.2014

Вы можете использовать функцию перекодирования в пакете car.

Например:

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

Для получения дополнительной информации о том, как использовать эту функцию, см. Файл справки.

person wmmurrah    schedule 16.04.2014

Я бы просто сделал вектор значений, который сопоставляется с уровнями вашего фактора, и сопоставил бы их. Приведенный ниже код - гораздо менее элегантное решение, чем мне бы хотелось, потому что я не могу понять, как выполнить индексацию с помощью вектор, но, тем не менее, это сработает, если ваши данные не слишком велики. Скажем, мы хотим сопоставить факторные элементы fact с числами в vals:

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)

Это должно работать для того, что вы описываете.

person Mike Nute    schedule 15.04.2014
comment
Майк, я считаю, что индексация - хороший подход; я думаю, это сработает. fact<-c(a=1,b=2,c=3); затем fact[data$myvar] - person user20650; 16.04.2014