У меня есть следующие данные, которые показывают значения для 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, но они не расставляют точки одинаково или в каком-либо определенном порядке, поэтому я пытаюсь изменить сам фрейм данных