Измените мои значения, чтобы окружить определенную точку R - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть следующие данные, которые показывают значения для 5 различных групп пациентов (по 3 пациента в каждой группе):

 dat <- data.frame(Cohort=c(1,1,1, 2,2,2, 3,3,3, 4,4,4, 5,5,5),
                   LEN_Dose=c(15,15,15, 25,25,25, 15,15,15, 10,10,10, 10,10,10),
                   DLT=c("N","N","N", "Y","Y","N", "Y","N","Y", "N","N","Y", "N","N","Y")) 

Я хотел бы изменить уровни когорты на +/- 0,2основного числа когорты, чтобы они не сидели друг на друге на графике.Я могу достичь того, что хочу, вот так:

 dat$Cohort <- dat$Cohort-0.2
 dat$Cohort <- ifelse(duplicated(dat$Cohort), dat$Cohort+0.2, dat$Cohort)
 dat$Cohort <- ifelse(duplicated(dat$Cohort), dat$Cohort+0.2, dat$Cohort) # have to run this twice as there are 3 patients

Итак, результат:

 head(dat)
 # Cohort LEN_Dose DLT
 #  0.8       15    N
 #  1.0       15    N
 #  1.2       15    N
 #  1.8       25    Y
 #  2.0       25    Y
 #  2.2       25    N

Но мне интересно, есть ли лучший способ сделать это?Например, каким-то образом вводится базовый уровень когорты, и какая-то функция автоматически вычисляет 3 значения, которые мне нужны?

Смысл в том, чтобы в конечном итоге построить график данных, используя этот график:

 ggplot(aes(x=Cohort, y=as.numeric(LEN_Dose)), data = dat) +
   ylab("Dose Level\n") +
   xlab("\nCohort") +
   ggtitle("\n") +
   scale_y_continuous(breaks = c(5, 10, 15, 25),
                      label = c("1.2mg/kg\n5mg", "1.2mg/kg\n10mg", "1.8mg/kg\n15mg", "1.8mg/kg\n25mg")) +
   scale_fill_manual(values = c("white", "darkred"), 
                     name="Had DLT") +
   geom_line(colour="grey20", size=1) +
   geom_point(shape=23, size=6, aes(fill=DLT), stroke=1.1, colour="grey20") + # 21 for circles
   theme_classic() +
   theme(legend.box.margin=margin(c(0,0,0,-10))) +
   expand_limits(y=c(5,25))

РЕДАКТИРОВАТЬ: У меня естьпробовал position = position_jitter, position = position_dodge и все другие типы позиций в самом ggplot, но они не расставляют точки одинаково или в каком-либо определенном порядке, поэтому я пытаюсь изменить сам фрейм данных

1 Ответ

0 голосов
/ 04 декабря 2018

Как насчет написания вашей функции дрожания, что-то вроде:

jitterit<- function(xTojitter= dat$Cohort, howMuchjitter=0.2){

x<-xTojitter
uni<-unique(x) 
for (i in 1:length(uni)) {
  if (is.na(uni[i])) {
    x[is.na(x)]<-NA
  } else if (sum(x==uni[i], na.rm = T) %%2 ==1) { 
    if(sum(x==uni[i], na.rm = T)==1){x[x==uni[i] & !is.na(x)][middle] <- uni[i]
    } else {
      middle<-ceiling (sum(x==uni[i], na.rm = T)/2)
      x[x==uni[i] & !is.na(x)][1:(middle-1)] <- uni[i] - howMuchjitter
      x[x==uni[i] & !is.na(x)][(middle+1):sum(x==uni[i], na.rm = T) ]<- uni[i] + howMuchjitter
  x[x==uni[i] & !is.na(x)][middle] <- uni[i]   
    }} else if (sum(x==uni[i], na.rm = T) %%2 ==0) {
  x[x==uni[i] & !is.na(x)]<- rep(c(uni[i] - howMuchjitter,uni[i]  + howMuchjitter), each= sum(x==uni[i],na.rm = T)/2)
}
  }

return(x)
}

Это будет работать для всех видов дублированных данных (четное или нечетное количество дублирования)

jitterit(xTojitter = c(1,1,2,1,2,NA), howMuchjitter=0.2)  
[1] 0.8 1.0 1.8 1.2 2.2  NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...