将具有不同列的 lapply 的结果放入一个数据框中

Put result from lapply with different columns to one data frame

我正在处理一个数据集,想要对一些变量进行一些描述性统计,并将它们放在一个数据框中。 我可以处理这样的情况:

dt<-data.frame('X1'=rnorm(10),
           'X2'=rnorm(10))
temp<-do.call(rbind, lapply(dt, summary))

还有这样的情况:

dt<-data.frame('X1'=rnorm(10),
           'X2'=rnorm(10))
dt[1,2]<-NA
dt[2,1]<-NA
temp<-do.call(rbind, lapply(dt, summary))

但是遇到下面这种情况,我做不到:

dt<-data.frame('X1'=rnorm(10),
           'X2'=rnorm(10))
dt[1,2]<-NA
temp<-do.call(rbind, lapply(dt, summary))

当一些变量包含 NA 而另一些变量不包含时,lapply 不同变量的结果将有不同的列:

> lapply(dt, summary)
$X1
      Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
-0.7821000 -0.2881000 -0.0003675  0.3195000  0.8114000  2.0230000 

$X2
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max.      NA's 
-1.336000 -0.604000 -0.005283  0.008491  0.784300  1.407000         1 

在这种情况下 rbind 将不再起作用。我确实意识到 rbnd.fill 可以在数据帧具有不同的列时进行行绑定,但是将每个变量的结果传输到数据帧然后通过 rbind.fill 将它们组合起来会有些乏味,我这样做鉴于 R 拥有的力量,相信有一个命令解决方案。

希望有人能在这方面帮助我,非常感谢你的时间和知识!

您可以将 rbind.fillbroom 包中的 tidy 结合起来,一次性获得,即

plyr::rbind.fill(lapply(dt, function(i) broom::tidy(summary(i))))
#    minimum         q1     median        mean         q3   maximum na
#1 -1.621968 -0.7001894 -0.2062857  0.06791479  0.5987752 2.4195609 NA
#2 -2.061762 -1.3925008 -1.1702881 -0.94991206 -0.9249380 0.6052219  1

使用 tidyverse 方式的答案,即 purrr 主要是:

dt<-data.frame('X1'=rnorm(10),
               'X2'=rnorm(10))
dt[1,2]<-NA

library(purrr)
library(broom)
dt %>%
  map(., summary) %>%
  map_df(broom::tidy)
#>     minimum         q1     median       mean        q3  maximum na
#> 1 -0.798480  0.5869163 0.89381256  0.9626454 1.6942529 2.218769 NA
#> 2 -1.331122 -1.0149286 0.05946167 -0.1562312 0.5235401 1.061640  1

对于你正在做的事情,你也可以对 ropensci 社区正在进行的关于 skimr 包的工作感兴趣。它尚未在 CRAN 上,但在 github 上。它旨在简化汇总统计的使用,与 tidyverse 方法

兼容
# devtools::install_github("ropenscilabs/skimr")
dt %>% skimr::skim()
#> Numeric Variables
#> # A tibble: 2 x 13
#>     var    type missing complete     n       mean        sd       min
#>   <chr>   <chr>   <dbl>    <dbl> <dbl>      <dbl>     <dbl>     <dbl>
#> 1    X1 numeric       0       10    10  0.9626454 0.9001430 -0.798480
#> 2    X2 numeric       1        9    10 -0.1562312 0.8539957 -1.331122
#> # ... with 5 more variables: `25% quantile` <dbl>, median <dbl>, `75%
#> #   quantile` <dbl>, max <dbl>, hist <chr>

仅使用 plyr 包,您可以使用强制 as 系列函数和 plyr::rbind.fill 来完成您想要的代码,类似于您原来的代码 post. plyr::rbind.fill 期望 data.frame,因此我们首先将 summary(命名向量)的输出转换为列表,然后使用 as.data.frame.list 转换为 data.frame。

do.call(plyr::rbind.fill, lapply(dt, function(x) as.data.frame.list(summary(x))))

这个returns

        Min.   X1st.Qu.     Median        Mean    X3rd.Qu.      Max. NA.s
1 -1.3228095 -0.9366220  0.3869426  0.05838389  0.85474059 1.1721839   NA
2 -0.8421435 -0.5083617 -0.4801625 -0.29357112 -0.02549078 0.4506287    1