R - 将 survfit 应用于列表并使用相应的名称绘制
R - apply survfit to a list and plot with corresponding names
我有一个命名数据框列表:
library(survival)
library(survminer)
surv.days<- runif(n = 50, min = 0, max = 500)
censor<- sample(c(0,1), 50, replace=TRUE)
survdata<- data.frame(surv.days, censor)
survlist<- list(survdata, survdata)
names(survlist)<- c("name1", "name2")
rm(survdata, censor, surv.days)
我想运行在每个数据帧上进行生存拟合,然后生成几张图(为了简单起见,我在这里只放了一张),每张图都有相应的标题。我认为 Map 是实现它的方法,所以:
titles<- names(survlist)
然后我定义要用于 运行 生存分析和绘图的函数:
survival.function<- function(survivaldata, datanames){
sfit<- survfit(Surv(surv.days, censor)~1, data=survivaldata)
ggsurvplot(sfit, conf.int=TRUE, risk.table=TRUE,
surv.median.line = "v",
title=datanames,
risk.table.height=.25)
}
并尝试应用它:
Map(survival.function, survlist, titles)
但是这个想法没有奏效:
"Error in eval(fit$call$data) : object 'survivaldata' not found "
有没有办法将 objects 正确分配给生存函数?
谢谢!
在这种情况下,错误消息似乎具有误导性,至少在我看来是这样。它似乎指向调用 survfit
中的错误,而实际上它是 ggsurvplot
中的错误,从 traceback()
的输出中可以看出。我首先尝试更改传递给 survival.function
的对象的名称。然后没有错误。但也没有情节。所以也在survival.function
里面加了一个print
调用。我将附上两个结果中的第一个。
survival.function<- function(data, datanames){
sfit<- survfit(Surv(surv.days, censor)~1, data=data)
print( ggsurvplot(sfit, conf.int=TRUE, risk.table=TRUE,
surv.median.line = "v",
title=datanames,
risk.table.height=.25) )
}
我希望我能更好地解释为什么这个 hack 有效。 (我只是根据错误消息和 traceback()
-结果猜测原因。)我使用的事实是 "missing" 对象的 name
是 "data"。这可能是 ggsurvplot
中的一个语义错误,您会帮助包的维护者向他发送一个 link 到这个完整记录的示例。我想知道如果维护者更改代码以便不使用 $data
而是使用 [[data]]
.
从环境访问列表成员名称,是否会有可能的改进
我有一个命名数据框列表:
library(survival)
library(survminer)
surv.days<- runif(n = 50, min = 0, max = 500)
censor<- sample(c(0,1), 50, replace=TRUE)
survdata<- data.frame(surv.days, censor)
survlist<- list(survdata, survdata)
names(survlist)<- c("name1", "name2")
rm(survdata, censor, surv.days)
我想运行在每个数据帧上进行生存拟合,然后生成几张图(为了简单起见,我在这里只放了一张),每张图都有相应的标题。我认为 Map 是实现它的方法,所以:
titles<- names(survlist)
然后我定义要用于 运行 生存分析和绘图的函数:
survival.function<- function(survivaldata, datanames){
sfit<- survfit(Surv(surv.days, censor)~1, data=survivaldata)
ggsurvplot(sfit, conf.int=TRUE, risk.table=TRUE,
surv.median.line = "v",
title=datanames,
risk.table.height=.25)
}
并尝试应用它:
Map(survival.function, survlist, titles)
但是这个想法没有奏效:
"Error in eval(fit$call$data) : object 'survivaldata' not found "
有没有办法将 objects 正确分配给生存函数?
谢谢!
在这种情况下,错误消息似乎具有误导性,至少在我看来是这样。它似乎指向调用 survfit
中的错误,而实际上它是 ggsurvplot
中的错误,从 traceback()
的输出中可以看出。我首先尝试更改传递给 survival.function
的对象的名称。然后没有错误。但也没有情节。所以也在survival.function
里面加了一个print
调用。我将附上两个结果中的第一个。
survival.function<- function(data, datanames){
sfit<- survfit(Surv(surv.days, censor)~1, data=data)
print( ggsurvplot(sfit, conf.int=TRUE, risk.table=TRUE,
surv.median.line = "v",
title=datanames,
risk.table.height=.25) )
}
我希望我能更好地解释为什么这个 hack 有效。 (我只是根据错误消息和 traceback()
-结果猜测原因。)我使用的事实是 "missing" 对象的 name
是 "data"。这可能是 ggsurvplot
中的一个语义错误,您会帮助包的维护者向他发送一个 link 到这个完整记录的示例。我想知道如果维护者更改代码以便不使用 $data
而是使用 [[data]]
.