【问题标题】:How to apply self-defined function on the result of group_by如何对 group_by 的结果应用自定义函数
【发布时间】:2015-02-23 22:22:46
【问题描述】:

我想按某个列对数据进行分组,然后用最近的观察结果替换 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替换函数?

非常感谢。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    以下是使用 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]
    

    【讨论】:

    • 感谢您的回答。如果我们在data.table中使用by,我们可以做if-else条件吗?在示例中,如果 A==1,则计算平均值,否则运行标准差。 @大卫阿伦堡
    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多