用dplyr编写自定义函数

时间:2014-08-03 02:09:47

标签: r function dplyr

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

eval(expr,envir,enclos)中的错误:   "函数"

的无效正式参数列表

我是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 个答案:

答案 0 :(得分:2)

如果没有样本数据和所需的输出,就无法测试代码,但这里有更多dplyr - 就像希望能够做到你想要的代码一样。如果没有,请使用一些示例数据和所需的输出更新您的问题。

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中 - 或者如果它是一个任意函数,你需要使用dplyr's do运营商。