自定义S3类的dplyr兼容性问题

时间:2017-05-09 18:36:17

标签: r dplyr

我写了一个名为errors的小R包,它将错误与数字向量相关联,并启用透明错误传播。我正努力使其与dplyr完全兼容。

首先,让我们采用众所周知的iris数据集,并为每个数值变量分配5%的误差:

library(errors)
library(dplyr)

iris_errors <- iris %>%
  mutate_at(vars(-Species), funs(set_errors(., .*0.05)))

head(iris_errors)                         # ok

每列都是errors S3对象,包含150个值及其相关的150个错误:

length(iris_errors$Sepal.Length)          # 150
length(errors(iris_errors$Sepal.Length))  # 150

现在,假设我们想要按物种分列每列的平均值:

iris_mean <- iris_errors %>%
  group_by(Species) %>%
  summarise_all(mean)

head(iris_mean)                           # error

显然,它有效,但格式化程序在我们尝试打印时失败了。发生的事情是,在某些时候,我们失去了所有的错误,但第一个错误:

length(iris_mean$Sepal.Length)            # 3
length(errors(iris_mean$Sepal.Length))    # 1!

1 个答案:

答案 0 :(得分:1)

似乎使用dplyr中的属性并不是一个微不足道的问题(请参阅tidyverse/dplyr#2773)。他们有计划,但暂时不会工作。

这是我尝试使用dplyr进行的分组摘要的纯R版本:

by(iris_errors, iris_errors$Species, function(i) {
  i$Species <- NULL
  lapply(i, mean)
})