Создать новые столбцы в l oop на основе разных наборов данных - PullRequest
1 голос
/ 28 февраля 2020

Вот краткое описание данных, которые у меня есть: данные выживания из 4 отдельных исследований, в которых сравниваются показатели выживаемости среди 20 групп. Каждое исследование длилось разное количество времени. Например, исследование 1 длилось 42 дня, а исследование 2 - 50 дней.

Вот снимок данных:

UniqueID    Time    Censored    Group1     Group2      Study
ABC123      6       1           1          111         1
DEF456      42      0           1          112         1
GHI789      42      0           2          344         1 
JKL012      38      1           2          564         1
MNO345      19      1           10         761         1
PQR678      13      1           5          222         2
STU901      5       1           20         333         2
VWX234      50      0           15         444         2 
YZA567      20      1           15         555         2
BCD890      50      0           12         555         2

Вот что я хочу сделать: я хочу создать функцию, которая позволяет пользователю выбирать два параметра (Study, Group1) для сравнения коэффициенты выживания.

Это то, что я пытался сделать до сих пор:

SurvA=function(a,b){
   setwd("path to my file")
   data=read.xlsx("mydata.xlsx",sheet=1)
   data_study$Study==a
   list(unique(data_study$Group1))
}

Я хочу написать al oop, который сканирует список всех уникальных номеров Group1 и создает спецификацию Group1 c переменные со следующими логами c в качестве примера:

data_study$Group1_10=ifelse(data_study$Group1==10,1,0)
data_study$Group1_12=ifelse(data_study$Group1==12,1,0)

Я не уверен, как поступить с l oop, который бы это сделал.

Однажды после завершения, остальная часть кода будет выглядеть так:

 library(survival)
 library(survminer)
 SurvA=function(a,b){
   setwd("path to my file")
   data=read.xlsx("mydata.xlsx",sheet=1)
   data_study$Study==a
   list(unique(data_study$Group1))

   #LOOP

   surv_object=Surv(time=data_study$Time,event=data_study$Censored)
   fit=survfit(surv_object~b,data=data_study)
   ggsurv=ggsurvplot(fit,data=data_study,pval=TRUE,xlim=c(0,60),
              title='Study 'a' Survival Plot for Group 'b' ',xlab="Time (days)")
   ggsurv$plot=ggsurv$plot+theme(plot.title=element_text(hjust=0.5))
   print(ggsurv)

}

Любая помощь будет принята с благодарностью! Кроме того, если у вас есть предложения относительно более эффективных способов написания того, что у меня уже есть, я был бы очень рад узнать о лучших способах сделать это.

1 Ответ

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

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

Поскольку только ваша функция необходимо обработать одну указанную группу b, мне кажется, проще всего создать одну переменную, указывающую членство в этой группе или нет, вместо того, чтобы перебирать все переменные, как вы предлагаете:

library(survival)
library(survminer)
SurvA <- function(dat, a, b) {
  dat <- dat[dat$Study == a,]
  dat$Group1Val <- ifelse(dat$Group1 == b, b, paste("Not", b))
  fit <- survfit(Surv(Time, Censored)~Group1Val, data=dat)
  print(ggsurvplot(fit, data=dat, pval=TRUE,
                   title=paste("Study", a, "Survival Plot for Group", b),
                   xlab="Time (Days)",
                   ggtheme=theme(plot.title=element_text(hjust=0.5))))
}
SurvA(dat, 1, 1)

Результат :

enter image description here

Данные:

set.seed(144)
s1g1S <- rexp(100, 1) ; s1g1C <- rexp(100, 0.5) ; s1g2S <- rexp(100, 1.2) ; s1g2C <- rexp(100, 0.5)
s2g1S <- rexp(100, 1) ; s2g1C <- rexp(100, 0.5) ; s2g2S <- rexp(100, 1.2) ; s2g2C <- rexp(100, 0.5)
dat <- data.frame(UniqueID=seq_len(200),
                  Time=c(pmin(s1g1S, s1g1C), pmin(s1g2S, s1g2C), pmin(s2g1S, s2g1C), pmin(s2g2S, s2g2C)),
                  Censored=as.numeric(c(s1g1S, s1g2S, s2g1S, s2g2S) > c(s1g1C, s1g2C, s2g1C, s2g2C)),
                  Group1=rep(c(1, 2, 1, 2), each=100), Study=rep(1:2, each=200))
...