r - R函数找不到作为参数提供的对象
问题描述
我正在尝试创建一个函数,该函数采用数据框,对每个基因(列)执行生存分析,并打印重要的生存曲线。我的数据如下所示,其中狗名作为行名,基因作为列名,最后两列是无病间隔(DFI,生存时间指标),以及是否应该审查样本(1)或不审查(0)。
狗的名字 | 基因1 | 基因2 | 友通 | 审查 |
---|---|---|---|---|
狗 1 | 高的 | 低的 | 130 | 0 |
狗 2 | 低的 | 高的 | 88 | 1 |
我有多个狗的数据框,所以我希望创建一个函数来避免重新输入相同的代码。以下代码在我自己运行时有效,但是当我尝试使用它创建函数时出现错误。
library(survival)
library(survminer)
survPlot <- function(x){
s <- Surv(x$DFI, x$Censor)
for (i in 1:(ncol(x)-2)){
n_high <- length(which(x[,i] == "High"))
n_low <- length(which(x[,i] == "Low"))
sfit <- survfit(s ~ x[,i])
pval <- surv_pvalue(sfit, data = as.data.frame(x))$pval
if (pval <= 0.05){
abc <- ggsurvplot(sfit, data = as.data.frame(x[,i]), pval = T, title = colnames(x)[i], legend.labs = c(paste0("High Expression", "\n", "n =", n_high), paste0("Low Expression", "\n", "n =", n_low)))
print(abc)
}
}
}
survPlot(mydata)
我收到错误 Error in FUN(X[[i]], ...) : object 'x' not found
,但 x 是函数中的参数,所以我不明白发生了什么。
**编辑
这是我的数据示例
mydata <- structure(list(`cfa-miR-142` = c("High", "Low", "High", "Low",
"Low", "Low", "Low", "Low", "Low", "Low"), `hsa-miR-133b` = c("Low",
"High", "Low", "Low", "High", "Low", "High", "Low", "High", "Low"
), `hsa-miR-20a-5p` = c("Low", "High", "Low", "High", "High",
"High", "High", "High", "High", "High"), `hsa-miR-19a-3p` = c("High",
"Low", "Low", "High", "High", "Low", "High", "High", "High",
"High"), `hsa-miR-222-3p` = c("Low", "Low", "Low", "Low", "Low",
"Low", "High", "Low", "Low", "Low"), `hsa-miR-451a` = c("Low",
"High", "Low", "Low", "High", "High", "High", "High", "High",
"High"), `cfa-miR-221` = c("Low", "Low", "Low", "Low", "Low",
"Low", "Low", "Low", "Low", "Low"), `cfa-miR-1` = c("High", "Low",
"High", "Low", "High", "Low", "Low", "High", "High", "Low"),
`hsa-miR-185-5p` = c("Low", "Low", "Low", "Low", "Low", "Low",
"Low", "Low", "Low", "Low"), `hsa-miR-145-5p` = c("High",
"Low", "High", "High", "High", "Low", "Low", "Low", "High",
"Low"), DFI = c(99, 1008, 238, 861, 277, 285, 26, 277, 591,
415), Censor = c(1, 0, 1, 0, 1, 1, 0, 1, 1, 1)), row.names = c("Dog_1",
"Dog_2", "Dog_3", "Dog_4", "Dog_5", "Dog_6", "Dog_7", "Dog_8",
"Dog_9", "Dog_10"), class = "data.frame")
解决方案
这些功能似乎很挑剔。看起来他们不能很好地容忍非标准的列名。我已添加make.names()
以确保列名是有效的变量名。我还使用了不同的方法来构建公式。尝试这个
survPlot <- function(x){
names(x) <- make.names(names(x))
for (i in 1:(ncol(x)-2)){
n_high <- length(which(x[,i] == "High"))
n_low <- length(which(x[,i] == "Low"))
form <- eval(bquote(Surv(DFI, Censor)~.(as.name(names(x)[i]))))
sfit <- do.call("survfit", list(form, data=quote(x)))
pval <- surv_pvalue(sfit, data=x)$pval
if (!is.na(pval) & pval <= 0.05){
abc <- ggsurvplot(sfit, data=x, pval = T, title = colnames(x)[i], legend.labs = c(paste0("High Expression", "\n", "n =", n_high), paste0("Low Expression", "\n", "n =", n_low)))
print(abc)
}
}
}
survPlot(mydata)
推荐阅读
- android - 使用expo在android设备中打开反应本机应用程序时出错
- python - 根据给定条件将新列添加到现有数据框列
- django - django设置默认时区
- reactjs - 已解决:我试图在反应中将更新数据从父级传递给子级,但它没有在子组件的功能中更新
- database - Mongoose:TypeError:模式路径`guildId.type`的值无效,得到值“未定义”
- javascript - 仅用于数据结构和数据库的前端(React)解决方案
- python - 如何转换宽数据框以绘制特定数据
- regex - 正则表达式在文本文件中突出显示高于 85% 红色的百分位数
- flyway - 如何创建脚本或 Flyway 可以配置为每次使用 SQL 回调调用它?
- spartacus-storefront - 斯巴达克斯 2.1.9 在 2.0.0 之后的购物车效果问题