我有一个计算功能"保留"和"添加"我的数据框中的列基于" 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)
}
答案 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
运营商。