代码之家  ›  专栏  ›  技术社区  ›  user113156

映射列表对象并应用公式

  •  1
  • user113156  · 技术社区  · 5 年前

    我试图将以下公式应用于我的每个列表整数。

    ((TP * TN) - (FP * FN)) / sqrt((TP + FP) * (TP+FN) * (TN+FP) * (TN+FN))
    

    我正在尝试 pmap 但似乎无法使计算工作。

    数据:

    TP <- list(12734L, 12765L, 12842L, 12786L)
    FP <- list(262L, 212L, 215L, 198L)
    FN <- list(635L, 869L, 943L, 1081L)
    TN <- list(869L, 654L, 500L, 435L)
    

    我运行以下命令:

    TP <- list(12734L, 12765L, 12842L, 12786L)
    FP <- list(262L, 212L, 215L, 198L)
    FN <- list(635L, 869L, 943L, 1081L)
    TN <- list(869L, 654L, 500L, 435L)
    
    lst1 <- list(TP, FP, FN, TN)
    purrr::pmap(lst1, ~ ((..1 * ..4) - (..2 * ..3))/sqrt((..1 + ..2) * (..1 + ..3) * (..4 + ..2) * (..4 + ..3)))
    

    哪些输出:

    [[1]]
    [1] NA
    
    [[2]]
    [1] NA
    
    [[3]]
    [1] NA
    
    [[4]]
    [1] NA
    
    Warning messages:
    1: In (..1 + ..2) * (..1 + ..3) * (..4 + ..2) :
      NAs produced by integer overflow
    2: In (..1 + ..2) * (..1 + ..3) * (..4 + ..2) :
      NAs produced by integer overflow
    3: In (..1 + ..2) * (..1 + ..3) * (..4 + ..2) :
      NAs produced by integer overflow
    4: In (..1 + ..2) * (..1 + ..3) * (..4 + ..2) :
      NAs produced by integer overflow
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   akrun    5 年前

    我们可以把所有东西都包起来 list a中的元素 列表

    lst1 <- list(TP, FP, FN, TN)
    

    这个 列表 元素都是整数类,根据计算,值 * 将得到超过值范围的非常大的数字 integer 。可能它应该转换为大整数类或使用 numeric

    library(purrr)
    pmap_dbl(lst1, ~ ((as.numeric(..1) * as.numeric(..4))  - 
                  (as.numeric(..2) * as.numeric(..3)))/
       sqrt((as.numeric(..1) + as.numeric(..2)) * (as.numeric(..1) + 
             as.numeric(..3)) * (as.numeric(..4) + as.numeric(..2)) * 
             (as.numeric(..4) + as.numeric(..3))))
    #[1] 0.6340100 0.5344409 0.4563071 0.4068497
    

    此外,作为 列表 如果长度都相等,最好将其转换为 vector 作为data.frame的列,我们可以更容易地应用这些函数

    library(dplyr)
    library(tidyr)
    tibble(TP, FP, FN, TN) %>% 
        unnest(c(TP, FP, FN, TN)) %>%
        mutate_all(as.numeric) %>%
        transmute(out = f1(TP, FP, FN, TN))
    # A tibble: 4 x 1
    #    out
    #  <dbl>
    #1 0.634
    #2 0.534
    #3 0.456
    #4 0.407
    

    哪里

    f1 <- function(TP, FP, FN, TN) {
             ((TP * TN) - (FP * FN)) /
              sqrt((TP + FP) * (TP+FN) * (TN+FP) * (TN+FN))
          }