mapply 不显示变量名

mapply doesn't display variable names

我正在尝试做一些列联表,但我不知道如何在使用 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”,我想显示例如“默认”和“平衡”。 有人可以给我一些建议吗?

这应该有效:

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 创建

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) 此输出作为 table 在许多论文中显示为 Table 1 并且有许多 R 包用于生成这样的 tables。可以在此处找到一长串此类软件包: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)