2

我想对summary.default()data.frame 中的变量进行数字汇总(在 base 包中)并在 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, _NA, numNA, ...)

实际上,这看起来像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 回答