Archive for R

Превращение бинарных dummy variables — обратно в номинативную в R

Давненько сюда ничего не писал, но видимо, снова начну.

В 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: если было больше одной единички в строке, то значение ячейки будет вектором из имён отмеченных переменных

Круговая диаграмма в R c помощью ggplot: красные, зелёные, золотопогонные

В общем-то, круговые диаграммы — штука не особо удобная. Но есть такая вещь — традиция, поэтому в ряде случаев приходится всё-таки рисовать эти кружочки. Может, это корпоративный стиль такой — побольше круглого.

Рисование круговой диаграммы в ggplot представляет собой слегка нетривиальную задачу, ибо, как мы увидим дальше, она представляет собой… закрученную столбиковую диаграмму!

library(ggplot2)

Начнём однако, с данных, которые имеет смысл отображать подобным образом. Речь идёт о необходимости отразить на графике данные долей, в сумме дающих 100%. Нашим набором данных станут шесть населённых пунктов. Три из них заняты красными, два зелёными и один — золотопогонными.

vlast<-c("красные","красные", "красные", "зелёные", "зелёные", "золотопогонные")

А впрочем, нет, пусть лучше наши данные будут не вектором а переменной в наборе данных, это более частый случай:

data<-data.frame(vlast=vlast)

Нарисуем для начала простой столбик:

ggplot(data=data, aes(x="", fill=vlast)) + geom_bar(stat="bin")

Выглядит это так:


Read more