2017-07-16 7 views
1

私はデータセットを扱っていますが、いくつかの変数の記述統計を1つのデータフレームに入れる必要があります。 私はこのような状況に対処することができます異なる列のlapplyの結果を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が含まれていますが、一部の変数には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は持っています。

私がこれを手伝ってくれることを願って、あなたの時間と知識を深く感謝します!

答えて

4

あなたはすなわちpurrr主に、broomパッケージからtidyrbind.fillを組み合わせて、一度にそれを得る、 tidyverse方法を使用して、すなわち

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

答えすることができます

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には載っていません。それは tidyverseアプローチとの互換性、簡素化要約統計量の使用を目指して、あなたはあなたのようなコードで欲しいものを達成するために一緒にplyr::rbind.fillと機能の強制asファミリを使用することができる唯一のplyrパッケージを使用

# 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、最初のソリューションは完全に動作します。まだ2番目のテストしていない。答えは出せないが、私はそれを立てるだろう。 –

+1

skimrがCRAN上にあることを言いたいと思っていました。これには、データ型に適用されない統計がNAに設定されている単一のデータフレームを返す関数skim_to_wide()があります。すべての変数は文字であるため、正しく書式設定されています。 – Elin

0

元の投稿。 plyr::rbind.fillはdata.frameを想定していますので、を使用して、最初にsummary(名前付きベクトル)の出力をリストに変換し、次に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.'と打ち込んだら、Rの' as.'ファミリーファミリーの膨大なセットを見ることができます。次に、Tabキーを押します。 – lmo

関連する問題