2013-02-23 4 views
1

Мне нужно преобразовать категориальные переменные в несколько дихотомических («фиктивных») переменных для использования в логистической регрессии. Скажем, мой фрейм данных:Как вызвать динамическое имя переменной внутри функции?

tdf <- data.frame(first=sample(c("A", "B", "C", "D"), 100, replace=T), 
         lobe = sample(c("RUL", "RML", "RLL", "LUL", "LLL"), 100, replace=T), 
         continuous=sample(1:100, 100), 
         smoker = sample(c("never", "less20", "more20"), 100, replace=T) 
        ) 

Я мог бы сделать вручную

first. <- with (tdf, factor (first)) 
dummies <- model.matrix(~ first.) 
dummies <- dummies[,-1] 
tdf <- cbind(tdf, dummies) 

Обратите внимание, что это важно, чтобы вызвать фактор «первый». (или, что более важно, «переменная»), поскольку фиктивные переменные наследуют этот префикс в их соответствующие имена, что упрощает их идентификацию позже («variable1.factor2», «variable1.factor3» и т. д.).

Мой вопрос: Как можно это сделать с помощью функции, которая бы программно присвоить имена переменных:

dummify <- function(df, vectorOfColIndices) { 
    cn <- colnames(df) 
    for (i in vectorOfColIndices) { 
    t. <- with (tdf, factor (df[i])) # temporary factor 
    assign (cn[i], t.) # give it the proper 'Variable.' name 
    dummies <- model.matrix(~ ????) # Stuck here: how do I call this newly created structure? 
    ... 
    } 
} 

Так что я могу впоследствии преобразовать фрейм данных, как это:

vd <- c(1,2,4) # columns that need to be converted into dummy vars 
df <- dummify(df, vd) 
+1

см. '? Reformulate' ... –

+4

Почему бы не использовать факторы? Вам не нужно вручную создавать фиктивные переменные при использовании R – Dason

+0

@Dason вы можете ссылаться или отвечать на вопрос в качестве примера? мне было бы интересно .. :) –

ответ

2

Согласитесь с комментарием Dason о том, что не так много ситуаций, когда вам придется вручную создавать манекены. И, если вы сделаете решение Энтони, все в порядке. Я представляю эту альтернативу просто для удовольствия :)

dummify <- function(df, vectorOfColIndices) { 
    for (i in vectorOfColIndices) { 
    var <- paste(names(df)[i], ".", sep="") 
    assign(var, df[[i]]) 
    df <- cbind(df, model.matrix(reformulate(var))[, -1]) 
    } 
    return(df) 
} 
2
dummify <- function(df , col.indicies.to.add.dummies) { 

    for (i in names(df)[ col.indicies.to.add.dummies ]) { 

     t. <- with(df , factor(df[ , i])) 

     dummies <- model.matrix(~t.) 

     colnames(dummies) <- paste(i , levels(t.) , sep = ".") 

     dummies <- dummies[ , -1 ] 

     df <- cbind(df , dummies) 

    } 

    df 
} 
Смежные вопросы