Коэффициенты построения по порядку с группирующей переменной - PullRequest
0 голосов
/ 11 мая 2018

Я работаю с R. У меня есть датафрейм, который выглядит так:

df <- (structure(list(year = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 
       2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 
       5L, 5L), .Label = c("2013", "2014", "2015", "2016", "2017"), 
       class = "factor"), user = structure(c(2L, 4L, 1L, 3L, 5L, 2L, 4L, 1L,
       3L, 5L, 2L, 4L, 1L, 3L, 5L, 2L, 4L, 1L, 3L, 5L, 2L, 4L, 1L, 3L, 5L),
       .Label = c("John", "Laura", "Liz", "Mark", "Martha"), class = "factor"), 
        spent = c(56, 64, 69, 38, 93, 70, 29, 94, 56, 76, 48, 17, 
        74, 67, 100, 29, 16, 23, 10, 51, 72, 35, 77, 83, 17)), 
        class = "data.frame", row.names = c(NA, -25L)))

Я пытаюсь сгенерировать гистограмму с переменной «потрачено» на оси Y, «пользователем» на оси X и фасетом для каждого года. Для каждого года пользователи должны быть заказаны на основе переменной «потрачено».

Я пробовал что-то вроде df$user2=factor(df$user, levels = df$user[order(df$year,df$spent)]) Но я получаю сообщение об ошибке, в котором говорится, что шестой фактор дублируется.

Любая помощь очень ценится!

Gerry

1 Ответ

0 голосов
/ 11 мая 2018

То, что вы описываете, является гистограммой.Гистограмма показывает распределение одной непрерывной переменной (например, hist(rnorm(100)).

. Ваш оператор заказа выдал ошибку, потому что может появиться каждый уровень в факторной переменной (каждое уникальное значение user в этом случае)только один раз в аргументе levels. factor позволяет установить новый порядок уникальных уровней user. Например, вместо алфавитного порядка мы можем сделать levels=c("Liz","Laura","Mark","John","Martha")).Затем df[order(df$user),] отсортирует фрейм данных по новому порядку user, а df[order(df$year, df$user),] отсортирует по year, чем user.Однако мы не можем использовать factor, чтобы получить различный порядок user для каждого year.

На основании вашего описания, похоже, что вы хотите граненый график, но с другим xОсь порядок в каждом аспекте.Вы можете сделать это в ggplot, если создадите новую переменную, которая устанавливает порядок оси x (я назвал эту переменную r ниже), а затем используйте аргумент labels в scale_x_continuous, чтобы получить нужные метки оси.

library(tidyverse)

df = df %>% 
  # Convert year back to numeric
  mutate(year = as.numeric(as.character(year))) %>% 
  # Sort data into the order we want
  arrange(year, spent) %>% 
  # Create a new variable with the desired row order
  mutate(r = row_number())

ggplot(df, aes(r, spent)) +
  geom_col() + 
  facet_grid(. ~ year, scale="free_x") +
  scale_x_continuous(breaks=df$r, labels=df$user)

enter image description here

Приведенный выше график выглядит запутанным из-за изменения порядка пользователя в каждом аспекте.Может быть, что-то вроде этого будет работать лучше:

ggplot(df, aes(year, spent, colour=user, group=user)) +
  geom_line() + 
  geom_point() +
  geom_text(data=df %>% filter(year==min(year)), aes(label=user), 
            hjust=1, position=position_nudge(x=-0.1), size=3) +
  expand_limits(y=0, x=2012.5) +
  theme_classic() +
  guides(colour=FALSE)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...