gpt4 book ai didi

r - dplyr 工作流中带有 do() 的 broom::tidy() 因 summaryDefault 对象而失败

转载 作者:行者123 更新时间:2023-12-05 07:52:19 32 4
gpt4 key购买 nike

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

我可以通过 broom::tidy 使用 plyr 方法得到一些理想的东西,如下所示:

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

但很明显,我问这个问题是为了找到问题的根源,如上文所述,在 do() 函数中使用 tidy() (summaryDefault) .

最佳答案

tl;dr 这看起来像是 broom:::tidy.summaryDefault 中的错误(我报告了它 here ),它假设摘要对象只有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 进行 hack/feature 请求,它以某种更 protected 方式指定 NA 列(.NA , _NA, numNA, ...)

实际上,这看起来像是 summaryDefault 中的错误。该函数的内容是

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

它没有考虑到摘要可能 中有NA 的 列这一事实。也就是说,names(ret)[7] 是一个实际的 NA 值,而不是 "NA" ...

关于r - dplyr 工作流中带有 do() 的 broom::tidy() 因 summaryDefault 对象而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33881557/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com