将具有不同列的 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.fill
与 broom
包中的 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
我正在处理一个数据集,想要对一些变量进行一些描述性统计,并将它们放在一个数据框中。 我可以处理这样的情况:
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.fill
与 broom
包中的 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