График с накоплением в 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 ответ

Решение

Исходя из вашего описания, вот что я понимаю, чего вы пытаетесь достичь. Он состоит из трех этапов:

  1. Замените все NA с "нет".
  2. Сложите все "да" по-рядному.
  3. На самом деле построение графика.

Так что обращайтесь к каждому пункту.

Предположим, что ваши данные выглядят следующим образом:

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()

введите описание изображения здесь

Другие вопросы по тегам