Давненько сюда ничего не писал, но видимо, снова начну.
В R порой довольно часто встречающиеся задачи не имеют готовой функции. Ну или я так плохо гуглю, что мне её не удаётся найти. Довольно часто для технических задач необходимо превратить номинативную шкалу в набор «dummy variables».
Как вы провели это лето?
Хорошо
Хорошо
Хорошо
Нормально
Плохо
превращается в
Провёл.лето.хорошо Провел.лето.нормально Провел.лето.плохо
1 0 0
1 0 0
1 0 0
0 1 0
0 0 1
Однако иногда возникает задача обратная — вернуть всё как было. Например, в моём случае, люди ставили галочки в полях анкеты в Excel, что кодировалось в итоге именно в такие переменные. Но при этом галочку они ставили только одну, в одно поле.
Я не нашёл такой готовой функции, так что пришлось писать своё. Функция использует команду melt из пакета reshape
undummy <-function(data)
{
data$q287328j<-seq(1:nrow(data))
data2<-melt(data,id=c("q287328j"))
data3<-data2[which(data2$value==1),]
data4<-aggregate(variable~q287328j,data=data3,paste)
data5<-merge(data,data4,by="q287328j",all.x=TRUE)
as.character(data5$variable)
}
На вход подаётся data.frame, состоящий из dummy variables.
На выходе переменная типа character, содержащая перекодированные данные (имена dummy variables, которые были отмечены единичками).
Замечание 1: если не было ни одной единички в строке, то значение ячейки будет NA
Замечание 2: если было больше одной единички в строке, то значение ячейки будет вектором из имён отмеченных переменных