如何在group_by的结果上应用自定义函数

时间:2015-02-23 22:22:47

标签: r dplyr

我希望按某些列对数据进行分组,然后将NA替换为最近的观察结果。有没有办法将聚合函数以外的函数应用于group_by的结果?

以下是使用ddply实现的两个示例:

1:

dt<-data.table(A=rep(c(1:3),2), B=c(1,2,NA,NA,2,5),C=c(9,NA,2,8,NA,4)
ddply(dt,"A",function(x){na.locf(x, na.rm = FALSE,fromLast=FALSE)})

2:

ddply(dt,"A",function(x){
 if (x[1,"A"]>2){
  x[,2:3]*1
 } else {
  x[,2:3]*(-1)
}

})

我不知道如何用groug_by复制它,这应该比ddply更快。顺便说一句,是否有比NA.locf更快的NA替换功能?

非常感谢提前。

1 个答案:

答案 0 :(得分:3)

以下是使用dplyr

执行此操作的方法
dt %>%
   group_by(A) %>%
   mutate_each(funs(na.locf(., na.rm = FALSE, fromLast = FALSE)))

但如果你已经使用data.table,为什么不直接使用呢?

dt[, lapply(.SD, na.locf, na.rm = FALSE, fromLast = FALSE), by = A]

您还可以使用:=运算符通过引用更新数据表,如

dt[, names(dt)[-1] := lapply(.SD, na.locf, na.rm = FALSE, fromLast = FALSE), A]