r - dplyr: `group_by` 和 `mutate_each` 错误

标签 r dplyr

我无法弄清楚为什么我的 dplyr group_by/mutate_each 函数崩溃了。当我使用默认 n=2 运行 mutate_each 时,它可以工作。 n=1 或 n=3 时都不起作用。

library(dplyr)

## moving average function
get.mavg <- function(mycol, n=2) {
  require(zoo)
  mycol <- na.locf(mycol, na.rm=FALSE)
  if(length(mycol) < n) 
    return(mycol)
  c(mycol[1:(n-1)], rollapply(mycol, width=n, mean, align="right"))
}

dummy <- data_frame(Name1=c("A","A","A","A","B","B","B"),
                    Name2=c("B","B","C","C","C","C","C"),
                    stat = c(0,5,5,10, 10,5,5),
                    day = c(1:4, 1:3) )
dummy %>%
  group_by(Name2) %>%
  mutate_each(funs(get.mavg(.,3)), stat:day)

Error: incompatible types, expecting a integer vector

如果我尝试将各列单独传递给我的移动平均函数,它会起作用!

get.mavg(dummy[dummy$Name2=="B",]$stat, 3)
# [1] 0 5
get.mavg(dummy[dummy$Name2=="C",]$stat, 3)
# [1] 5.000000 10.000000  8.333333  8.333333  6.666667

发生什么事了?

最佳答案

a bug如果混合使用 double 型和数字型,则会出现错误。我认为这是你的问题。

如果您更改函数,请确保始终返回 double 值:

get.mavg <- function(mycol, n=2) {
  require(zoo)
  mycol <- na.locf(mycol, na.rm=FALSE)
  if(length(mycol) < n) 
    return(as.double(mycol))
  c(mycol[1:(n-1)], rollapply(mycol, width=n, mean, align="right"))
}

它对我来说效果很好:

dummy %>%
  group_by(Name2) %>%
  mutate_each(funs(get.mavg(.,3)), stat:day)
Source: local data frame [7 x 4]
Groups: Name2 [2]

  Name1 Name2      stat      day
  (chr) (chr)     (dbl)    (dbl)
1     A     B  0.000000 1.000000
2     A     B  5.000000 2.000000
3     A     C  5.000000 3.000000
4     A     C 10.000000 4.000000
5     B     C  8.333333 2.666667
6     B     C  8.333333 2.333333
7     B     C  6.666667 2.000000

关于r - dplyr: `group_by` 和 `mutate_each` 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34108527/

相关文章:

r - 将多个子标题转置为 R 中的因子列

r - 计算R中向量中重复数字序列的长度

r - 如何使用 dplyr 检测面板数据中变量随时间的变化?

r - 从 VCF 文件中提取样本数据

r - 如何比较两个数据框是否具有相同的列名和类?

r - R中的子集字符向量

r - 更改文本注释的背景颜色以增加对比度和可见性

r - 如何防止命令行参数由 R 解释而不是仅由我的脚本解释?

r - group_by操作后dplyr如何为每个组生成数据帧?

r - 将 mutate_at 与 mutate_if 一起使用