首页 文章

用dplyr编写自定义函数

提问于
浏览
-1

我有一个函数来计算“保留”和“添加”列到我的数据框,基于每行中“obsnum”的值(见下面的函数),user_id . 它使用ddply正常工作,但ddply太占用内存,所以有人建议我使用dplyr包 . 这是我在dplyr中使用此函数时收到的错误消息 .

eval中的错误(expr,envir,enclos):“function”的无效形式参数列表

我是dplyr的新手,所以我不知道我的函数格式有什么问题或者如何将自定义函数放入dplyr . 我想基于变量“obsnum”将此函数应用于我的数据集中的每一行 . 该函数需要按user_id分组,因此我需要使用dplyr .

有人可以告诉我让dplyr识别我的功能有什么问题吗?我应该使用mutate(),因为我要添加列? df1是我的原始数据框 . df2是我试图用“保留”和“添加”这两个新列创建的数据集 . 非常感谢你 .

df2 < - df1% . %

group_by(user_id) %.%
function(x) {
x = x[order(x$obsnum), ]
if (length(x$obsnum) == 1) {
  x$retained <- FALSE
  x$addition <- TRUE
}
else {
  x$retained <- c(x$obsnum[1:(length(x$obsnum)-1)] + 1 == x$obsnum[2:length(x$obsnum)], FALSE)
  x$addition <- c(TRUE, x$obsnum[2:length(x$obsnum)] != x$obsnum[1:(length(x$obsnum)-1)] + 1)
}
return(x)

}

1 回答

  • 2

    如果没有样本数据和所需的输出,那么's no way to test the code, but here'更像是类似的代码,希望能够做到你想要的 . 如果没有,请使用一些示例数据和所需输出更新您的问题 .

    library(dplyr)
    
    df2 <- df1 %>%
      group_by(user_id) %>%
      arrange(user_id, obsnum) %>%
      mutate(retained = obsnum +1 == lead(obsnum, 1, default = FALSE),
             addition = lead(obsnum, 1, default = TRUE) != obsnum +1)
    

    基本上,因为你只是添加列,你可以使用 mutate 并且仍需要首先定义函数(在dplyr-pipe之前)然后使用它 - 在mutate内部 - 或者如果它需要使用's an arbitrary function, you' d dplyr的 do 运算符 .

相关问题