【问题标题】:How to call a named variable in a user-defined formula? Not recognized using dplyr::summarise()如何在用户定义的公式中调用命名变量?使用 dplyr::summarise() 无法识别
【发布时间】:2021-05-14 20:37:26
【问题描述】:

我正在尝试使用 pROC 包中的 ci.auc() 函数创建一个函数来提取“曲线下面积”估计值的 2 个命名变量的置信区间,但它会产生错误: Error in model.frame.default(formula = anchor, data = namedvar1, : 'data' must be a data.frame, environment, or list 如何解决这个问题?有没有更好的方法来指定从哪个数据帧中绘制命名变量?

原始代码运行良好:

library(pROC)

df <- structure(list(anchor1 = c(1, 0, 1, 0, 1, 0), namedvar1 = c(0.603, 
-0.006, 0, 0.263, 0, -0.089), namedvar2 = c(0.150346263678009, 
0.388250731888, -0.2579633906095, 0.2562039253, 0.139948502022, 
-0.267652844)), row.names = c(6L, 7L, 12L, 13L, 19L, 29L), class = "data.frame")


# Base example with to extract CI bounds & estimate
 as.numeric (ci.auc ( roc (df$anchor1, df$namedvar1, smooth = FALSE,         
                         direction = "<" ,ci = TRUE, boot.stratified = TRUE )  ) )

# Output looks good:
[1] 0.2908208 0.7777778 1.0000000

太好了,所以我将上述内容集成到我的函数中(我想为多个命名变量执行此操作):

### CREATE FUNC TO CALCULATE AUC and 95% CIs

new_roc <- function( df, anchor, na.rm = T) {
  anchor <- enquo(anchor)

  # Calculate and save this information as an object
  dplyr::summarise(df, 
                   # ci.auc() & roc() are from pROC package
                   "Var1 AUC CIs"  = as.numeric (ci.auc (roc (anchor, namedvar1, smooth = FALSE,         
                                                                 direction = "<" ,ci = TRUE, boot.stratified = TRUE )  ) ),
                   "Var2 AUC CIs"  = as.numeric (ci.auc (roc (anchor, namedvar2, smooth = FALSE, 
                                                                 direction = "<" ,ci = TRUE, boot.stratified = TRUE )  ) )
  ) 
}

但是当我测试它时,我得到一个错误!

# Try the function

new_roc(df, anchor1 )

# Error output: 
`Error in model.frame.default(formula = anchor, data = namedvar1,  :'data' must be a data.frame, environment, or list`

我试过class(df),确实是data.frame,所以不确定是什么问题。

为了尝试隔离问题,我尝试了内部代码,但首先指定了数据框 - 不起作用:

 # Doesn't work to pipe the df
df %>% 
  as.numeric (ci.auc (roc (anchor1, namedvar1, smooth = FALSE,         
                                        direction = "<" ,ci = TRUE, boot.stratified = TRUE )  ) )
  
## Produces error

Error in roc(anchor1, namedvar1, smooth = FALSE, direction = "<",  : 
  object 'anchor1' not found
 

也许我不必要地使用 dplyr?是否有不同的方法来指定从哪个数据框绘制命名变量?谢谢!

我也尝试过放弃 dplyr 并直接调用数据帧,但也不起作用:

new_roc <- function( df, anchor, na.rm = T) {
  anchor <- enquo(anchor)

  # Calculate and save this information as an object
                   # ci.auc() & roc() are from pROC package
                   "Var1 AUC CIs"  = as.numeric (ci.auc (roc (data[[anchor], data[[namedvar1], smooth = FALSE,         
                                                                 direction = "<" ,ci = TRUE, boot.stratified = TRUE )  ) ),
                   "Var2 AUC CIs"  = as.numeric (ci.auc (roc (data[[anchor], data[[namedvar2], smooth = FALSE, 
                                                                 direction = "<" ,ci = TRUE, boot.stratified = TRUE )  ) )
  ) 
}

# Produces a different Error:
Error in .subset2(x, i, exact = exact) : 
  invalid subscript type 'language' 

【问题讨论】:

  • I在输入数据中,列名正好是anchor
  • 感谢@akrun,我已将输入数据更新为“anchor1”以匹配其余代码。 “anchor1”是实际使用公式时要指定的锚的示例。
  • 请在我的解决方案中测试功能
  • 澄清:解决方案不太有效 - 当我使用列名为 anchor1 的更新输入数据,然后调用 new_roc(df, anchor1) 时,我收到错误 Error: Column @987654332 @ 必须是长度 1(一个汇总值),而不是 3 ' 我尝试在您的解决方案中用 {{namedvar1}} 和 {{namedvar2}} 而不是 {{anchor}} 周围的大括号替换,但在 (function ( arg) : 找不到对象“namedvar1”。
  • 更新了我的 dplyr,现在您的解决方案有效!谢谢!

标签: r function dplyr roc


【解决方案1】:

我们需要使用!!enquo 进行评估,或者可以将其修改为{{}}

new_roc <- function( df, anchor, na.rm = TRUE) {



      dplyr::summarise(df, 
             
             `Var1 AUC CIs`  = as.numeric (ci.auc (roc ({{anchor}},
                  namedvar1, smooth = FALSE,         
                    direction = "<" ,ci = TRUE, boot.stratified = TRUE )  ) ),
               `Var2 AUC CIs`  = as.numeric (ci.auc (roc ({{anchor}},
               namedvar2, smooth = FALSE, 
                  direction = "<" ,ci = TRUE, boot.stratified = TRUE )  ) )
     ) 
  }

-测试

new_roc(df, anchor1)
#Setting levels: control = 0, case = 1
#Setting levels: control = 0, case = 1
#  Var1 AUC CIs Var2 AUC CIs
#1    0.2908208    0.0000000
#2    0.7777778    0.3333333
#3    1.0000000    0.9866547

相同
as.numeric (ci.auc ( roc (df$anchor1, df$namedvar1, smooth = FALSE,         
                         direction = "<" ,ci = TRUE, boot.stratified = TRUE )  ) )
#Setting levels: control = 0, case = 1
#[1] 0.2908208 0.7777778 1.0000000

【讨论】:

    【解决方案2】:

    如果您不想使用dplyr 方法,请尝试:

    library(pROC)
    
    new_roc <- function( df, anchor) {
      
    data.frame(Var1_AUC_CIs = as.numeric(ci.auc(roc(df[[anchor]], df$namedvar1, smooth = FALSE, direction = "<",
                              ci = TRUE, boot.stratified = TRUE))), 
               Var2_AUC_CIs = as.numeric(ci.auc(roc(df[[anchor]], df$namedvar2, smooth = FALSE, direction = "<",
                              ci = TRUE, boot.stratified = TRUE)))) 
    }
    new_roc(df, 'anchor1')
    
    #  Var1_AUC_CIs Var2_AUC_CIs
    #1    0.2908208    0.0000000
    #2    0.7777778    0.3333333
    #3    1.0000000    0.9866547
    

    【讨论】:

      猜你喜欢
      • 2021-02-27
      • 1970-01-01
      • 2023-03-29
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 2017-06-10
      • 2020-01-21
      相关资源
      最近更新 更多