【问题标题】:dplyr: `group_by` and `mutate_each` errordplyr:`group_by` 和 `mutate_each` 错误
【发布时间】:2015-12-05 17:28:14
【问题描述】:

我无法弄清楚为什么我的 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)

错误:不兼容的类型,需要一个整数向量

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

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

发生了什么事?

【问题讨论】:

  • 虽然这并不等同于你所拥有的,但你真正想要的是:dummy %&gt;% group_by(Name2) %&gt;% mutate_each(funs(rollapplyr(., 3, mean, partial = TRUE)), stat:day)。 partial=TRUE 参数导致在开头采用部分均值,即输出变为 c( mean(x[1]), mean(x[1:2]), mean(x[1:3]), mean(x[2:4]), ..., mean(x[(n-2):n]) ) 还要注意 rollapplyr 末尾的 r。

标签: r dplyr


【解决方案1】:

有a bug,如果你有双精度和数字的混合,你会得到一个错误。我认为这是你的问题。

如果你改变你的函数,以确保你总是返回一个双精度:

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

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 2015-09-02
    • 1970-01-01
    • 2021-02-14
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    相关资源
    最近更新 更多