2016-01-25 5 views
1

Imagine у ​​вас есть набор данных с категориальной переменной, и вы хотите, чтобы превратить его в фиктивные переменные:R Использование анонимной функции для создания фиктивных переменных

df<-data.frame(read.table(header = TRUE, text = 
"ID Mobile 
1 Yes 
2 No 
3 Yes 
4 Yes 
5 No")) 

Я обычно делаю это следующим образом:

for(level in levels(df$Mobile)){ 
df[paste("Mobile", level, sep = "_")] <- ifelse(df$Mobile == level, 1, 0) 
} 

Это прекрасно работает. Однако теперь представьте, что у вас много таких категориальных переменных. Вместо того, чтобы копировать и вставлять эти три строки кода несколько раз, вы хотите использовать анонимную функцию. Я попробовал его следующим образом:

Mediatable<-function(VARIABLE1, DUMMY1, INDICATOR1){ 
    for(level in levels(VARIABLE1)){ 
     df[paste(DUMMY1, level, sep = "_")] <- ifelse(VARIABLE1 == level, 1, 0) 
    } 
} 

Я бы тогда запустить его следующим образом:

Mediatable(df$Mobile, "Mobile") 

Я попробовал это, и ничего не произошло. Любая идея, что пошло не так? Мне очень нравится идея использования анонимной функции для выполнения этой работы по целому ряду категориальных переменных. BTW, пожалуйста, проигнорируйте, что я хочу назначить конкретное имя моим фиктивным переменным, используя вставку. Здесь это не имеет значения. Благодаря!

+0

Ваша функция не возвращает значение. добавьте 'return (df)' вне цикла for –

+0

@PierreLafortune, это так верно! Большое спасибо за это! Отправьте его как ответ, и я сразу же помету его! Спасибо друг! – DomB

+2

Попробуйте 'model.matrix (~ Mobile + 0, df)' –

ответ

3

Добавить услугу return(df) в свою функцию. Или использовать dcast из reshape2 для другого подхода:

library(reshape2) 
dcast(df, ...~Mobile, length) 
# ID No Yes 
# 1 1 0 1 
# 2 2 1 0 
# 3 3 0 1 
# 4 4 0 1 
# 5 5 1 0 

С вашей функции:

Mediatable<-function(VARIABLE1, DUMMY1, INDICATOR1){ 
     for(level in levels(VARIABLE1)){ 
       df[paste(DUMMY1, level, sep = "_")] <- ifelse(VARIABLE1 == level, 1, 0) 
     } 
     return(df) 
} 

newdf <- Mediatable(df$Mobile, "Mobile") 
newdf 
# ID Mobile Mobile_No Mobile_Yes 
# 1 1 Yes   0   1 
# 2 2  No   1   0 
# 3 3 Yes   0   1 
# 4 4 Yes   0   1 
# 5 5  No   1   0 
+0

Возможно, я был слишком быстрым. Просто вопрос для разъяснения. 'return (df)' печатает вывод, который я надеюсь найти в моем наборе данных. Но он не производит его постоянно. Что я могу сделать, чтобы анонимная функция действительно создавала переменные, которые мне нужны? Спасибо – DomB

+0

Я добавил вашу функцию, исправил –

+1

Конечно! Ты прав! благодаря – DomB

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