Включите указанную c, но переменный уровень фактора в фасетном ggplot - PullRequest
1 голос
/ 03 марта 2020

У меня есть фрейм данных с контрольной и лечебной группами, где определенные c обработки связаны со специфическими c контролями во времени. Я хочу нанести на график каждую группу обработки против ее связанного контроля многогранным способом, но я не могу понять, как добавить определенные c данные к различным фасетам в кадре. Я думаю, что мне нужно создать новый столбец для кодирования новой переменной, с которой я столкнусь, но я не могу понять, как дублировать контрольные данные, когда несколько обработок используют один и тот же элемент управления.

В следующем примере кадра данных в столбце «Код» содержится информация о том, какой элемент управления связан с какой обработкой. В некоторых случаях контроль связан только с одним лечением. В других случаях один и тот же элемент управления связан с несколькими обработками.

   Group<-c("A","B","C","D","E","F","G", "A","B","C","D","E","F","G")
   Group.Type<-c("Con","Con","Con","Trt","Trt","Trt","Trt", "Con","Con","Con","Trt","Trt","Trt","Trt")
   Code <- c("NA", "NA", "NA", "A", "A", "B", "C", "NA", "NA", "NA", "A", "A", "B", "C")
   Time <- c(1,1,1,1,1,1,1,2,2,2,2,2,2,2)
   Value<-c(1, 2, 3, 4,2, 1, 2, 3,4, 5, 6, 3,3, 4)

   data<-data.frame(cbind(Group, Group.Type, Code, Value, Time))
   data$Value <- (as.numeric(data$Value))

По сути, я хочу граненый график, похожий на этот формат, но мне нужны значения для панели A, нанесенные на панели D и E и значения для панели B, нанесенные на панель F, и значения для панели C, нанесенные на панель G.

    library(ggplot2)
    ggplot(data, aes(x =Time, y = Value)) +geom_point() +geom_line(group = 1)+facet_wrap (~Group) 

Будем весьма благодарны за любые предложения. Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 03 марта 2020

Вы создаете данные для сопоставления ваших элементов управления:

map2ctrl = unique(data[data$Code!="NA",c("Group","Code")])

  Group Code
4     D    A
5     E    A
6     F    B
7     G    C

Сложность в том, что вам нужно иметь A дважды (один раз для D и один раз для E):

newdf = lapply(1:nrow(map2ctrl),function(i){
cbind(data[data$Group %in% sapply(map2ctrl[i,],as.character),],
facet=map2ctrl[i,1])
})
newdf = do.call(rbind,newdf)

Затем построите график (немного некрасиво, но вы должны заставить Time к нумерации c, но это работает, потому что время является фактором, с которого нужно начинать):

ggplot(newdf) +
geom_point(aes(x =Time, y = Value,col=Group.Type)) +
geom_line(aes(x =as.numeric(Time), y = Value,col=Group.Type))+
facet_wrap (~facet)

enter image description here

...