dplyr的`mutate`函数在使用两次时会返回错误。

3
似乎对于存储在列表列中的某些对象,dplyr::mutate 只能一次性地对它们进行操作。也就是说,连续两次使用mutate 会导致错误。
library(dplyr)
one_mod <- data.frame(grp = "a", x = runif(5,0,1)) %>%
  tbl_df %>%
  mutate(y = rnorm(x,x*2,1)) %>%
  group_by(grp) %>%
  do(mod = lm(y~x,data = .)) 

这种方法行不通:

one_mod %>%
  mutate(rsq = summary(mod)$r.squared) %>%
  mutate(aic = AIC(mod))
# Error: unsupported type for column 'mod' (VECSXP)

但是这个确实可以。
one_mod %>%
  mutate(rsq = summary(mod)$r.squared,
     aic = AIC(mod))
#Source: local data frame [1 x 4]
#Groups: grp
#
#  grp     mod       rsq      aic
#1   a <S3:lm> 0.6615589 10.63317

哦,嗯,我们可能正在失去行属性。你能否请提交一个错误报告? - hadley
1个回答

2

这个问题已经在这个提交中得到了解决。

正如Hadley所示,两种mutate版本中的第一种没有创建rowwise_df对象,这是我们确保每个组只涉及数据的一行的保证,因此我们可以引用mod而不是mod[[1]]。除非我们知道数据可以被视为rowwise_df,否则我们不使用mutate处理列表列。

现在一切都好了,并将您的示例用作新的回归测试

one_mod <- data.frame(grp = "a", x = runif(5,0,1)) %>%
  tbl_df %>%
  mutate(y = rnorm(x,x*2,1)) %>%
  group_by(grp) %>%
  do(mod = lm(y~x,data = .))
one_mod %>%
  mutate(rsq = summary(mod)$r.squared) %>%
  mutate(aic = AIC(mod))
# Source: local data frame [1 x 4]
# Groups: <by row>
# 
#   grp     mod        rsq      aic
# 1   a <S3:lm> 0.04744827 11.91253

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接