【问题标题】:How to correctly scope a dataframe in R to use with a formula in a function如何正确限定 R 中的数据框以与函数中的公式一起使用
【发布时间】:2021-11-10 14:46:58
【问题描述】:

经过一番挖掘(123),如果我正确理解它们,似乎有一些关于在函数中使用公式会导致范围问题的帖子。有些人建议使用环境、分配或<<- 来解决这个问题,但我一直被如何使用它们所困扰(并且首先困惑为什么会出现问题)。

让我们试试这个玩具代码:

library(survival)
library(survminer)
set.seed(1)

give_p_val <- function() {
  df <- data.frame('OS' = ovarian[, 'futime'], 'Survival_event' = ovarian[, 'fustat'])
  subgroup <- sample(nrow(df), nrow(df)/2)
  df$Class <- 'A'
  df$Class[subgroup] <- 'B'
  
  fit2 <- survfit(Surv(OS, Survival_event) ~ Class, data=df) 
  return(surv_pvalue(fit2))
}
give_p_val( )

它不起作用,除非您直接运行它,这暗示了范围界定问题。

此代码将返回一个合适的对象:

survfit(Surv(futime, fustat) ~ rx, data=ovarian)

那么,如果我们在作用域内复制数据框,为什么函数会中断呢?

testit<-function(){
  ovarian2 <- ovarian
  fit2 <- survfit(Surv(futime, fustat) ~ rx, data=ovarian2)
  return(surv_pvalue(fit2))
}
  
testit()

最终,我如何在函数中生成数据框,以便由正在使用的公式正确处理? 谢谢!

【问题讨论】:

    标签: r function survival-analysis scoping


    【解决方案1】:

    这是survminer 包中的known issue,以及surv_pvalue 如何与survfit 对象交互。如果您将survfit 更改为survminer 包的版本surv_fit,您的功能将正常工作。

    give_p_val <- function() {
      df <- data.frame('OS' = ovarian[, 'futime'], 'Survival_event' = ovarian[, 'fustat'])
      subgroup <- sample(nrow(df), nrow(df)/2)
      df$Class <- 'A'
      df$Class[subgroup] <- 'B'
      fit2 <- surv_fit(Surv(OS, Survival_event) ~ Class, data=df) 
      surv_pvalue(fit2, data = df)
    }
    give_p_val( )
    #   variable      pval   method pval.txt
    # 1    Class 0.2615363 Log-rank p = 0.26
    

    【讨论】:

    • 我查看了surv_fit的暴露代码。一系列令人印象深刻的测试和条件分支,带有错误报告或分派到两个隐藏的 .survfit 函数之一。
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2016-10-02
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2019-04-16
    • 2021-10-27
    相关资源
    最近更新 更多