Как сделать несколько участков для положительных и отрицательных результатов только в R? - PullRequest
0 голосов
/ 19 апреля 2020

Допустим, у меня есть следующий фрейм данных:

ID     amount_ID   timespan    change
3      1           20          2
3      2           40          3
3      3           60          6
3      4           80          4
3      5           100         5
9      1           25          1
9      2           50          -2
9      3           75          0
9      4           100         -1
3      1           33.33       4
3      2           66.67       8
3      3           100         7
9      1           33.33       1
9      2           66.67       3
9      3           100         4

Ронак Шах помог мне создать 2 графика. Код для этих 2 графиков показан ниже. На этих 2 графиках показано среднее изменение для каждого идентификатора на оси Y и временного интервала на оси.

library(ggplot2)
library(dplyr)

df %>%
  arrange(ID, timespan) %>%
  group_by(ID) %>%
  mutate(change = cummean(change)) %>%
  ggplot() + aes(timespan, change) + 
  geom_line() + 
  facet_wrap(.~ID, scales = "free_y")

2 графика

Теперь я наткнулся на новая проблема. Как я могу сделать 3 новых графика, где мы смотрим на последнее изменение для каждого ID и смотрим, является ли это число положительным или отрицательным. Итак, у нас есть 1 график для указанного c ID, если последнее изменение является положительным, и 1 график для указанного c ID, если последнее изменение является отрицательным. В df мы видим, что ID 3 заканчивается положительным 2 раза, а ID 9 заканчивается отрицательным и положительным. Таким образом, в общей сложности это даст нам 3 новых графика для среднего изменения на ID.

Спасибо!

1 Ответ

0 голосов
/ 23 апреля 2020

Лучший способ сделать это через facet_grid, который я продемонстрирую ниже. Однако вы можете подумать о том, какой у вас уровень репликации в этом эксперименте. Из данных видно, что у вас есть несколько испытаний для каждого идентификатора, но ваш расчет cummean группирует все это вместе, что означает, что вы не можете составить график каждого испытания, поскольку вы их агрегировали. В этом упражнении я разбил данные по испытаниям, так как в противном случае это не имело бы особого смысла.

Сначала создайте пример данных. Обратите внимание, что вы должны стараться не использовать df в качестве имени для фрейма данных, поскольку это уже относится к функции в R.

library(ggplot2)
library(dplyr)

#create some data to use. Note some variable to specify which trial it is
dd <- expand.grid(ID = 1:5,
                  trial = 1:10,
                  timespan = c(20,40,60,80,100))
dd$change <- sample(-10:10, size = nrow(dd), replace = T)
dd <- arrange(dd, ID, trial, timespan)

Данные выглядят так:

 ID trial timespan change
1   1     1       20     -9
2   1     1       40     -3
3   1     1       60      5
4   1     1       80     -3
5   1     1      100     10
6   1     2       20      7
7   1     2       40     10
8   1     2       60     -6
9   1     2       80    -10
10  1     2      100     -4

Затем создайте столбец last_change, который обозначает, закончилась ли проба отрицательным или положительным изменением. Мы делаем это, индексируя изменение для каждого испытания ID x, чтобы оно равнялось последнему / наибольшему timespan для этого испытания. Это означает, что даже если некоторые испытания будут выполняться разное количество времени, этот код все равно будет работать.

dd <- dd %>%
  group_by(ID, trial) %>%
  mutate(last_change = ifelse(change[timespan == max(timespan)]<0, "neg", "pos")) %>%
  ungroup()

Чтобы получить 3 грани на графике, нам нужно будет продублировать все данные и назначить это значение «all» в столбце last_change.

#repeat all of the data with a last_change value of "all" for the third plot
dd.dup <- mutate(dd, last_change = "all")

dd.all <- bind_rows(dd, dd.dup)

Затем мы можем вставить этот набор данных в код, который вы имели ранее. Обратите внимание, что я добавил trial и last_change к вызову group_by, потому что это единицы репликации. Вам нужно будет подумать, имеет ли это смысл для вашего экспериментального плана.

dd.all %>%
  arrange(ID, trial, timespan) %>%
  group_by(ID, trial, last_change) %>%
  mutate(change = cummean(change)) %>%
  ungroup() %>%
  ggplot(aes(x = timespan, y = change)) +
  geom_line(aes(group = trial)) +
  facet_grid(ID~last_change, scales = "free_y")

Это приводит к следующему графику:

enter image description here

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