2017-07-16 33 views
1

我正在處理一個數據集,並希望對某些變量進行一些描述性統計並將它們放在一個數據框中。 我可以應付這樣的情況:將來自不同列的lapply的結果放到一個數據框中

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(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有。

希望有人能幫助我,對您的時間和知識深表感謝!

回答

4

您可以tidybroom包一次性使用tidyverse方式組合rbind.fill並得到它,即

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 
+1

非常感謝@Sotos,一個美好的解決方案完美的作品。我會以此爲答案! –

2

一個答案,即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 

對於你正在做的事情,你也可以對正在進行的關於01的工作感興趣由ropensci社區包。它不是在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> 
+0

謝謝@cderv,第一個解決方案完美地工作。還沒有測試第二。儘管無法回答,但我會盡力解決。 –

+1

想要提及的是現在在CRAN上的skimr。它有一個函數skim_to_wide(),返回單個數據幀,其中不適用於數據類型的統計信息被設置爲NA。所有的變量都是字符,所以它們格式正確。 – Elin

0

只使用plyr包,您可以使用強制as家庭與plyr::rbind.fill一起功能來完成你想要有類似你的代碼是什麼您的原始帖子。 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)))) 

這將返回

 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 
+0

謝謝@Imo,優雅的一線解決方案。永遠不會意識到這種操作。 –

+0

通過在控制檯中輸入'as.',然後點擊TAB鍵,可以在R中看到大量as.'函數族。 – lmo

相關問題