我正在尝试使用函数在R中自动执行简单任务。
C
是字符变量列表。 mydata
- 是数据集。
基本上,我需要将vector C
中的每个字符串作为函数的输入。
数据集:
mydata <- structure(list(a = c(1L, 1L, 1L, 1L, 0L, 0L, 1L, 0L), b = c(4L,3L, 1L, 2L, 1L, 5L, 2L, 2L), c = c(1L, 1L, 1L, 1L, 1L, 1L, 1L,1L), d = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), t = c(42L, 34L, 74L,39L, 47L, 8L, 36L, 39L), s = c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L)), .Names = c("a", "b", "c", "d", "t", "s"), row.names = c(NA,8L), class = "data.frame")
代码:
c<-c("a","b","c","d")
plot<-function()
for (i in c)
{
fit<-survfit(Surv(s,t)~paste(i), dat=mydata)
ggsurvplot(fit, pval = TRUE)
}
plot()
我遇到以下错误:
model.frame.default中的错误(公式= Surv(mydata $ s,mydata $ t)〜 paste(i),:可变长度不同(找到&#39; paste(i)&#39;)
我也试过了重新制定:
积&LT; -function()
for(i in c)
{
survfit(更新(Surv(s,t)〜。,重新制定(i)),data = mydata)
ggsurvplot(fit,pval = TRUE)
}
情节()
但此代码也会出现此错误:
Error in reformulate(i) : object 'i' not found
有助于使此代码有效吗?
由于
答案 0 :(得分:1)
动态构建公式可能很棘手。而不是
fit(Surv(mydata$s,mydata$t)~paste(i), dat=mydata)
使用
fit(update(Surv(s,t)~., reformulate(i)), data=mydata)
您应避免将$
与公式一起使用。这里reformualte()
有助于从字符串构建公式,update
结合了公式的各个部分。如果您想了解更多详细信息,请参阅这些功能的帮助页面。
以下是样本输入
的完整工作版本#sample input
mydata <- structure(list(a = c(1L, 1L, 1L, 1L, 0L, 0L, 1L, 0L), b = c(4L,3L, 1L, 2L, 1L, 5L, 2L, 2L), c = c(1L, 1L, 1L, 1L, 1L, 1L, 1L,1L), d = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), t = c(42L, 34L, 74L,39L, 47L, 8L, 36L, 39L), s = c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L)), .Names = c("a", "b", "c", "d", "t", "s"), row.names = c(NA,8L), class = "data.frame")
c<-c("a","b","c","d")
和代码
library(survival)
library(survminer)
plot <- function() {
for (i in c) {
fit <- survfit(update(Surv(t,s)~., reformulate(i)), data=mydata)
ggsurvplot(fit)
}
}
plot()
当我将其复制/粘贴到R中时,我没有收到任何错误。您必须做的事情与您发布的示例代码不同。