2

summary.default()data.frame の変数に対して(基本パッケージで) 数値集計を実行し、broom パッケージで tidy() を使用したいのですが、これはどういうわけか失敗します。

この例では、data.frame を作成します。

df <- data.frame(group = c(rep('M', 6), 'F', 'F', 'M', 'M', 'F', 'F'),
                 val = c(6, 5, NA, NA, 6, 13, NA, 8, 10, 7, 14, 6))

plyr(1.8.3)、dplyr(0.4.2)、broom(0.3.7) を (この順序で)ロードします。参考までに、64 ビット Windows で R 3.2.2 を実行していますが、Unix の 3.2.1 でも同様の問題が発生します。

これにより、望ましい出力が得られると思います。

df %>% group_by(group) %>% do(tidy(summary(.$val)))

しかし、エラーメッセージが表示されます:

Error: corrupt data frame at index 1

以下に示すように、plyrアプローチを使用して望ましいものを得ることができます。broom::tidy

df %>% group_by(group) %>% do(summ = summary(.$val)) %>% 
    daply(.(group), function(x) tidy(x$summ[[1]]))

group minimum q1 median mean  q3   maximum <NA>
    F 6       7  8      9.333 11   14      1   
    M 5       6  6.5    7.833 9.25 13      2  

しかし、明らかに、上記のようtidy()に関数内で (summaryDefault)を使用することに関する問題の根本に到達するために、この質問をしています。do()

4

1 に答える 1

0

tl;drこれはバグのように見えます(ここでbroom:::tidy.summaryDefault報告しました)。これは、集計オブジェクトに 6 つの要素しかないことを前提としています (データに値がある場合のように 7 つではありません)。かなり簡単に修正できるように見えますが、今は時間がありません...NA

options(error=recover)どこで問題が発生しているかを確認していました。以下の内容に基づいて、問題は列名に関係していると思います"NA"。これは、ある時点で非標準的な方法で評価される必要があります。

物事が壊れたとき、私たちはやろうとしていますrbind_all(out[[1]])。ここに私たちが持っているものがあります:

 str(out[[1]])
List of 2
 $ :'data.frame':   1 obs. of  7 variables:
  ..$ minimum: num 6
  ..$ q1     : num 7
  ..$ median : num 8
  ..$ mean   : num 9.33
  ..$ q3     : num 11
  ..$ maximum: num 14
  ..$ NA     : num 1
 $ :'data.frame':   1 obs. of  7 variables:
  ..$ minimum: num 5
  ..$ q1     : num 6
  ..$ median : num 6.5
  ..$ mean   : num 7.83
  ..$ q3     : num 9.25
  ..$ maximum: num 13
  ..$ NA     : num 2

コンポーネント データ フレームの名前を変更すると、すべて問題ありません。

Browse[1]> rbind_all(lapply(out[[1]],setNames,letters[1:7]))
Source: local data frame [2 x 7]

      a     b     c     d     e     f     g
  (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
1     6     7   8.0 9.333 11.00    14     1
2     5     6   6.5 7.833  9.25    13     2

問題のある列だけの名前を変更しても機能します。

 ff <- function(x) { names(x)[7] <- ".NA"; x }
Browse[1]> rbind_all(lapply(out[[1]],ff))
Source: local data frame [2 x 7]

  minimum    q1 median  mean    q3 maximum   .NA
    (dbl) (dbl)  (dbl) (dbl) (dbl)   (dbl) (dbl)
1       6     7    8.0 9.333 11.00      14     1
2       5     6    6.5 7.833  9.25      13     2

したがって、最善の方法は、より保護された方法で列をbroom::tidy指定するためにハック/機能要求を行うことです ( , , , ...)NA.NA_NAnumNA

実際、これは のバグのようsummaryDefaultです。その機能の内容は、

ret <- as.data.frame(t(as.matrix(x)))
colnames(ret) <- c("minimum", "q1", "median", "mean", "q3", 
    "maximum")
ret

これは、要約に列が含まれている可能性があるという事実を考慮していません。NA'sつまりnames(ret)[7]実際の NA 値ではなく"NA"...

于 2015-11-23T23:36:13.063 に答える