首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何拉取一个基于组的向量来传递给dplyr总结或变异中的一个函数?

我如何拉取一个基于组的向量来传递给dplyr总结或变异中的一个函数?
EN

Stack Overflow用户
提问于 2019-03-08 06:40:37
回答 2查看 82关注 0票数 2

我正在尝试使用psych包中的AUC函数创建一个关于准确性、敏感度和特异性的汇总表。我想为分组变量的每个级别定义输入向量(t,一个4x1的向量)。

我所尝试的似乎忽略了分组。

示例:

代码语言:javascript
运行
复制
library(tidyverse)
library(psych)

Data <- data.frame(Class = c("A","B","C","D"),
                   TP = c(198,185,221,192),
                   FP = c(1,1,6,1),
                   FN = c(42,55,19,48),
                   TN = c(569,570,564,569))

Data %>% 
  group_by(Class) %>%
  mutate(Accuracy = AUC(t = unlist(.[1,2:5], use.names=FALSE))$Accuracy,
         Sensitivity = AUC(t = unlist(.[1,2:5], use.names=FALSE))$Sensitivity,
         Specificity = AUC(t = unlist(.[1,2:5], use.names=FALSE))$Specificity)

这使我接近正确的输出,除了准确性、敏感度和特异度的值只在第一行计算,然后重复计算:

代码语言:javascript
运行
复制
# A tibble: 4 x 8
# Groups:   Class [4]
  Class    TP    FP    FN    TN Accuracy Sensitivity Specificity
  <fct> <dbl> <dbl> <dbl> <dbl>    <dbl>       <dbl>       <dbl>
1 A       198     1    42   569    0.947       0.995       0.931
2 B       185     0    55   570    0.947       0.995       0.931
3 C       221     6    19   564    0.947       0.995       0.931
4 D       192     1    48   569    0.947       0.995       0.931

我也尝试过使用summarize

代码语言:javascript
运行
复制
Data %>% 
  group_by(Class) %>%
  summarize(Accuracy = AUC(t = unlist(.[1,2:5], use.names=FALSE))$Accuracy,
         Sensitivity = AUC(t = unlist(.[1,2:5], use.names=FALSE))$Sensitivity,
         Specificity = AUC(t = unlist(.[1,2:5], use.names=FALSE))$Specificity)

但输出结果与上面相同。

所需的输出是每个"Class“级别的唯一计算

代码语言:javascript
运行
复制
# A tibble: 4 x 8
  Class    TP    FP    FN    TN Accuracy Sensitivity Specificity
  <fct> <dbl> <dbl> <dbl> <dbl>    <dbl>       <dbl>       <dbl>
1 A       198     1    42   569     0.95        0.99        0.93
2 B       185     0    55   570     0.93        0.99        0.91
3 C       221     6    19   564     0.97        0.97        0.97
4 D       192     1    48   569     0.94        0.99        0.92

我如何在summarize或mutate中调用函数来维护组?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-08 07:14:54

这是可行的

代码语言:javascript
运行
复制
Data %>% 
  group_by(Class) %>%
  mutate(Accuracy = AUC(t = unlist(.[Class,2:5], use.names=FALSE))$Accuracy,
         Sensitivity = AUC(t = unlist(.[Class,2:5], use.names=FALSE))$Sensitivity,
         Specificity = AUC(t = unlist(.[Class,2:5], use.names=FALSE))$Specificity)

但也许这一点更清楚

代码语言:javascript
运行
复制
Data %>% 
  group_by(Class) %>%
  mutate(Accuracy = AUC(t = c(TP, FP, FN, TN))$Accuracy,
         Sensitivity = AUC(t = c(TP, FP, FN, TN))$Sensitivity,
         Specificity = AUC(t = c(TP, FP, FN, TN))$Specificity)
票数 0
EN

Stack Overflow用户

发布于 2019-03-08 07:22:19

为了避免为每个类多次调用AUC,我编写了一个包装器,如下所示:

代码语言:javascript
运行
复制
# Load libraries
library(tidyverse)
library(psych)

# Create data frame
Data <- data.frame(Class = c("A","B","C","D"),
                   TP = c(198,185,221,192),
                   FP = c(1,1,6,1),
                   FN = c(42,55,19,48),
                   TN = c(569,570,564,569))

# Wrapper function
AUC_wrapper <- function(Class, TP, FP, FN, TN){
  res <- AUC(t = c(TP, FP, FN, TN))
  data.frame(Class = Class, 
             TP = TP,
             FP = FP,
             FN = FN,
             TN = TN,
             Accuracy = res$Accuracy, 
             Sensitivity = res$Sensitivity, 
             Specificity = res$Specificity)
}

# Run using purrr
pmap_dfr(Data, AUC_wrapper)

#   Class  TP FP FN  TN  Accuracy Sensitivity Specificity
# 1     A 198  1 42 569 0.9469136   0.9949749   0.9312602
# 2     B 185  1 55 570 0.9309494   0.9946237   0.9120000
# 3     C 221  6 19 564 0.9691358   0.9735683   0.9674099
# 4     D 192  1 48 569 0.9395062   0.9948187   0.9222042
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55053971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档