如何对 group_by 的结果应用自定义函数
How to apply self-defined function on the result of group_by
我想按某些列对数据进行分组,然后用最近的观察结果替换 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替换函数?
非常感谢。
以下是使用 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]
您还可以使用 :=
运算符通过引用更新数据 table,如
dt[, names(dt)[-1] := lapply(.SD, na.locf, na.rm = FALSE, fromLast = FALSE), A]
我想按某些列对数据进行分组,然后用最近的观察结果替换 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替换函数?
非常感谢。
以下是使用 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]
您还可以使用 :=
运算符通过引用更新数据 table,如
dt[, names(dt)[-1] := lapply(.SD, na.locf, na.rm = FALSE, fromLast = FALSE), A]