График с накоплением в R с пересчетом линии отношения
У меня есть данные с одним наблюдением на строку:
rm(list = ls(all = TRUE))
mydf <- data.frame(kind = sample(c("good", "bad"), 100, replace = TRUE), var1 = sample(c("yes", "no", "yes"), 100, replace = TRUE), var2 = sample(c("yes", "no"), 100, replace = TRUE), var3 = sample(c( "yes", "no"), 100, replace = TRUE), var4 = sample(c( "yes", "no", "yes", "no", "NA"), 100, replace = TRUE), var5 = sample(c( "yes", "no", "yes", "no", "NA"), 100, replace = TRUE), var6 = sample(c( "yes", "no", "yes", "no", "NA"), 100, replace = TRUE))
Мне нужно: составить столбчатую диаграмму с несколькими параллельными столбцами, по одному столбцу для каждого вида (хороший против плохого), показывающий, сколько у каждого вида есть 0 "да", сколько у 1 " да "вар" и т. д., до "да" для всех 6 переменных. Ось Y = количество, ось X = семь категорий (0 да переменные, 1 да переменная и т. Д.). Каждый столбец должен иметь цветовой код с накоплением, показывающий вклад каждой переменной в общую высоту столбца. НС рассматриваются как "нет". Кроме того, линия пересечения, показывающая отношение количества (хорошо)/ количество (плохо) для каждой из семи категорий оси X
1 ответ
Исходя из вашего описания, вот что я понимаю, чего вы пытаетесь достичь. Он состоит из трех этапов:
- Замените все NA с "нет".
- Сложите все "да" по-рядному.
- На самом деле построение графика.
Так что обращайтесь к каждому пункту.
Предположим, что ваши данные выглядят следующим образом:
mydf <- data.frame(kind = sample(c("good", "bad"), 100, replace = TRUE),
var1 = sample(c("yes", "no", "yes"), 100, replace = TRUE),
var2 = sample(c("yes", "no"), 100, replace = TRUE),
var3 = sample(c( "yes", "no"), 100, replace = TRUE),
var4 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE),
var5 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE),
var6 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE))
1
Заменить все NA на "нет" будет просто:
mydf[is.na(mydf)] <- "no"
здесь мы ищем через data.frame и заменяем все na
без использования оператора присваивания.
2
Чтобы добавить все в ряд, я использовал apply
функция. В функции применения вы можете использовать ?apply
чтобы определить аргументы, но в двух словах, вы (1-й аргумент) просто указать data.frame
, (2-й аргумент) задает направление, 1 - для строки и 2 - для столбца, (3-й аргумент) - функцию, которую вы хотите применить к направлению.
mydf$total.yes <- apply(mydf, 1, function(x) {
return(length(x[x=="yes"]))
})
3
Наконец сюжет. Самый простой и эстетичный способ создания сюжета - это использовать ggplot
, Установите его, набрав install.packages("ggplot2")
, Для гистограмм я буду ссылаться на эту [документацию](здесь: http://docs.ggplot2.org/0.9.3.1/geom_bar.html), в противном случае код будет выглядеть следующим образом.
library(ggplot2)
ggplot(mydf, aes(total.yes, fill=kind)) +
geom_bar(position="dodge")
который будет производить сюжет ниже:
Я надеюсь, что это отвечает на вопросы, которые вы были после. Полный код выглядит следующим образом:
mydf <- data.frame(kind = sample(c("good", "bad"), 100, replace = TRUE),
var1 = sample(c("yes", "no", "yes"), 100, replace = TRUE),
var2 = sample(c("yes", "no"), 100, replace = TRUE),
var3 = sample(c( "yes", "no"), 100, replace = TRUE),
var4 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE),
var5 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE),
var6 = sample(c( "yes", "no", "yes", "no", NA), 100, replace = TRUE))
library(ggplot2)
# replace all NA values to no, this step seems redundant because you're only
# counting yes's
mydf[is.na(mydf)] <- "no"
# for each row figure out how many "yes" there are...
mydf$total.yes <- apply(mydf, 1, function(x) {
return(length(x[x=="yes"]))
})
# see example here: http://docs.ggplot2.org/0.9.3.1/geom_bar.html
#using your data
ggplot(mydf, aes(total.yes, fill=kind)) +
geom_bar(position="dodge")
geom_bar
на самом деле составляется по умолчанию (см. [документация](здесь: http://docs.ggplot2.org/0.9.3.1/geom_bar.html), если он составлен, он будет выглядеть примерно так:
ggplot(mydf, aes(total.yes, fill=kind)) +
geom_bar()