根据不同的数据集循环创建新列
Create new columns in loop based on different datasets
以下是我所拥有数据的简要说明:来自 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
这就是我想要做的:我想创建一个函数,允许用户select 两个参数(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)
}
如有任何帮助,我们将不胜感激!此外,如果您有更有效的方法来编写我已经掌握的内容的建议 - 我将非常乐意学习更好的方法来完成此操作。
最终听起来您正在处理一个代表大量研究结果的数据框。您想要编写一个函数,将研究标识符和该研究中的患者组作为输入,并且您希望该函数绘制指定组患者与非指定组患者的生存曲线。
因为你的函数只需要处理一个指定的组 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))
以下是我所拥有数据的简要说明:来自 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
这就是我想要做的:我想创建一个函数,允许用户select 两个参数(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)
}
如有任何帮助,我们将不胜感激!此外,如果您有更有效的方法来编写我已经掌握的内容的建议 - 我将非常乐意学习更好的方法来完成此操作。
最终听起来您正在处理一个代表大量研究结果的数据框。您想要编写一个函数,将研究标识符和该研究中的患者组作为输入,并且您希望该函数绘制指定组患者与非指定组患者的生存曲线。
因为你的函数只需要处理一个指定的组 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))