【问题标题】:mapply doesn't display variable namesmapply 不显示变量名
【发布时间】:2022-01-12 00:15:27
【问题描述】:

我试图做一些列联表,但我不知道在使用 mapply 函数时如何提取列名。

这是数据示例:

set.seed(123)  ## for sake of reproducibility
n <- 10
dat <- data.frame(balance=factor(paste("DM", 1:n)), 
                  credit_history=sample(c("repaid", "critical"), 10, replace = TRUE),
                  purpose=sample(c("yes", "no"), 10, replace = TRUE),
                  employment_rate=sample(c("0-1 yrs", "1-4 yrs", ">4 yrs"), 10, replace = TRUE),
                  personal_status=sample(c("married", "single"), 10, replace=TRUE),
                  other_debtors=sample(c("guarantor", "none"), 10, replace= TRUE),
                  default=sample(c("yes", "no"), 10, replace = TRUE))

dt1 <- dat[ , c(1:6)]
dt2 <- dat[ , "default"]

mapply(function(x, y) table(x, y), dt1, MoreArgs=list(dt2))

上面的代码只显示“x”和“y”,我想显示例如“默认”和“平衡”。 有人可以给我一些建议吗?

【问题讨论】:

    标签: r dplyr tidyverse purrr mapply


    【解决方案1】:

    1)使用table的dnn参数:

    f <- function(...) table(..., dnn = c("balance", "default"))
    mapply(f, dt1, MoreArgs=list(dt2))
    

    给予:

    $balance
           default
    balance no yes
      DM 1   0   1
      DM 10  1   0
      DM 2   0   1
      DM 3   0   1
      DM 4   1   0
      DM 5   1   0
      DM 6   0   1
      DM 7   1   0
      DM 8   0   1
      DM 9   0   1
    
    $credit_history
              default
    balance    no yes
      critical  2   2
      repaid    2   4
    
    $purpose
           default
    balance no yes
        no   2   3
        yes  2   3
    
    $employment_rate
             default
    balance   no yes
      >4 yrs   2   0
      0-1 yrs  1   4
      1-4 yrs  1   2
    
    $personal_status
             default
    balance   no yes
      married  3   3
      single   1   3
    
    $other_debtors
               default
    balance     no yes
      guarantor  4   3
      none       0   3
    

    2) 或者您可能想要这个:

    f <- function(x, y, z) table(x, z, dnn = c(y, "default"))
    mapply(f, dt1, names(dt1), MoreArgs=list(dt2))
    

    给予:

    $balance
           default
    balance no yes
      DM 1   0   1
      DM 10  1   0
      DM 2   0   1
      DM 3   0   1
      DM 4   1   0
      DM 5   1   0
      DM 6   0   1
      DM 7   1   0
      DM 8   0   1
      DM 9   0   1
    
    $credit_history
                  default
    credit_history no yes
          critical  2   2
          repaid    2   4
    
    $purpose
           default
    purpose no yes
        no   2   3
        yes  2   3
    
    $employment_rate
                   default
    employment_rate no yes
            >4 yrs   2   0
            0-1 yrs  1   4
            1-4 yrs  1   2
    
    $personal_status
                   default
    personal_status no yes
            married  3   3
            single   1   3
    
    $other_debtors
                 default
    other_debtors no yes
        guarantor  4   3
        none       0   3
    

    3) 这个输出作为表格出现在许多论文中,如表 1 所示,并且有许多 R 包用于生成此类表格。可以在此处找到一长串此类软件包:https://github.com/kaz-yos/tableone#similar-or-complementary-projects。我们在下面展示了其中一个包 tableone 包的用法,但如果需要,请尝试所有列出的包。

    library(tableone)
    
    dat2 <- transform(dat, balance = factor(as.character(balance), 
      levels = paste("DM", 1:10)))
    tab1 <- CreateTableOne(strata = "default", data = dat2)
    print(tab1, showAllLevels = TRUE)
    

    给予:

                         Stratified by default
                          level     no         yes       p      test
      n                             4          6                    
      balance (%)         DM 1      0 (  0.0)  1 (16.7)   0.350     
                          DM 2      0 (  0.0)  1 (16.7)             
                          DM 3      0 (  0.0)  1 (16.7)             
                          DM 4      1 ( 25.0)  0 ( 0.0)             
                          DM 5      1 ( 25.0)  0 ( 0.0)             
                          DM 6      0 (  0.0)  1 (16.7)             
                          DM 7      1 ( 25.0)  0 ( 0.0)             
                          DM 8      0 (  0.0)  1 (16.7)             
                          DM 9      0 (  0.0)  1 (16.7)             
                          DM 10     1 ( 25.0)  0 ( 0.0)             
      credit_history (%)  critical  2 ( 50.0)  2 (33.3)   1.000     
                          repaid    2 ( 50.0)  4 (66.7)             
      purpose (%)         no        2 ( 50.0)  3 (50.0)   1.000     
                          yes       2 ( 50.0)  3 (50.0)             
      employment_rate (%) >4 yrs    2 ( 50.0)  0 ( 0.0)   0.143     
                          0-1 yrs   1 ( 25.0)  4 (66.7)             
                          1-4 yrs   1 ( 25.0)  2 (33.3)             
      personal_status (%) married   3 ( 75.0)  3 (50.0)   0.895     
                          single    1 ( 25.0)  3 (50.0)             
      other_debtors (%)   guarantor 4 (100.0)  3 (50.0)   0.324     
                          none      0 (  0.0)  3 (50.0)           
    

    【讨论】:

    • 选项号 (2) 是我要找的。非常感谢很好的解释。
    【解决方案2】:

    这应该可行:

    set.seed(123)  ## for sake of reproducibility
    n <- 10
    dat <- data.frame(balance=factor(paste("DM", 1:n)), 
                      credit_history=sample(c("repaid", "critical"), 10, replace = TRUE),
                      purpose=sample(c("yes", "no"), 10, replace = TRUE),
                      employment_rate=sample(c("0-1 yrs", "1-4 yrs", ">4 yrs"), 10, replace = TRUE),
                      personal_status=sample(c("married", "single"), 10, replace=TRUE),
                      other_debtors=sample(c("guarantor", "none"), 10, replace= TRUE),
                      default=sample(c("yes", "no"), 10, replace = TRUE))
    
    dt1 <- dat[ , c(1:6)]
    dt2 <- dat[ , "default"]
    
    mapply(function(x, y, z) {table(balance=x, default=y)}, dt1, MoreArgs=list(dt2))
    #> $balance
    #>        default
    #> balance no yes
    #>   DM 1   0   1
    #>   DM 10  1   0
    #>   DM 2   0   1
    #>   DM 3   0   1
    #>   DM 4   1   0
    #>   DM 5   1   0
    #>   DM 6   0   1
    #>   DM 7   1   0
    #>   DM 8   0   1
    #>   DM 9   0   1
    #> 
    #> $credit_history
    #>           default
    #> balance    no yes
    #>   critical  2   2
    #>   repaid    2   4
    #> 
    #> $purpose
    #>        default
    #> balance no yes
    #>     no   2   3
    #>     yes  2   3
    #> 
    #> $employment_rate
    #>          default
    #> balance   no yes
    #>   >4 yrs   2   0
    #>   0-1 yrs  1   4
    #>   1-4 yrs  1   2
    #> 
    #> $personal_status
    #>          default
    #> balance   no yes
    #>   married  3   3
    #>   single   1   3
    #> 
    #> $other_debtors
    #>            default
    #> balance     no yes
    #>   guarantor  4   3
    #>   none       0   3
    mapply(function(x, y, z) {table(x, y, dnn=c(z,'default'))}, dt1,z=names(dt1), MoreArgs=list(dt2))
    #> $balance
    #>        default
    #> balance no yes
    #>   DM 1   0   1
    #>   DM 10  1   0
    #>   DM 2   0   1
    #>   DM 3   0   1
    #>   DM 4   1   0
    #>   DM 5   1   0
    #>   DM 6   0   1
    #>   DM 7   1   0
    #>   DM 8   0   1
    #>   DM 9   0   1
    #> 
    #> $credit_history
    #>               default
    #> credit_history no yes
    #>       critical  2   2
    #>       repaid    2   4
    #> 
    #> $purpose
    #>        default
    #> purpose no yes
    #>     no   2   3
    #>     yes  2   3
    #> 
    #> $employment_rate
    #>                default
    #> employment_rate no yes
    #>         >4 yrs   2   0
    #>         0-1 yrs  1   4
    #>         1-4 yrs  1   2
    #> 
    #> $personal_status
    #>                default
    #> personal_status no yes
    #>         married  3   3
    #>         single   1   3
    #> 
    #> $other_debtors
    #>              default
    #> other_debtors no yes
    #>     guarantor  4   3
    #>     none       0   3
    

    reprex package (v2.0.1) 于 2021-12-06 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 2013-07-27
      • 2021-10-10
      • 1970-01-01
      • 2017-09-23
      相关资源
      最近更新 更多