【问题标题】:Create new columns in loop based on different datasets根据不同的数据集循环创建新列
【发布时间】:2020-02-28 15:29:34
【问题描述】:

以下是我所拥有数据的简要说明:来自 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))
}

我想编写一个循环来扫描列表中所有唯一的 Group1 数字,并使用以下逻辑创建 Group1 特定变量作为示例:

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

我不确定如何继续执行会导致这种情况发生的循环。

完成后,其余代码将如下所示:

 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)

}

任何帮助将不胜感激!此外,如果您对更有效的方法来编写我已经掌握的内容有建议 - 我会很高兴了解更好的方法来做到这一点。

【问题讨论】:

    标签: r function loops ggplot2 survival


    【解决方案1】:

    最终听起来您是在一个代表一系列研究结果的数据框上进行操作。您想编写一个函数,该函数将研究标识符和该研究中的患者组作为输入,并且您希望该函数绘制指定组中患者与非患者组的生存曲线。

    由于您的函数只需要处理单个指定的组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)
    

    结果:

    数据:

    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))
    

    【讨论】:

      猜你喜欢
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      相关资源
      最近更新 更多