【问题标题】:Write custom function with dplyr使用 dplyr 编写自定义函数
【发布时间】:2014-08-03 02:09:46
【问题描述】:

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

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

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

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

df2

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)

}

【问题讨论】:

  • 您可能正在寻找函数do.call(FUNC, list(arguments)) 另外,请查看data.table 包,它允许您通过引用修改数据(更快、更高效),更不用说更简单的语法了
  • 非常感谢!记住这一点非常有帮助。我最终首先定义了我的函数,然后进行了安排和 group_by,然后作为第三步调用该函数。可能不是很优雅,但它确实有效。

标签: r function dplyr


【解决方案1】:

没有示例数据和所需的输出,就无法测试代码,但这里有更多类似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 管道之前)然后使用它 - 在 mutate 内部 - 或者如果它是任意函数,则需要使用 dplyr's do 运营商。

【讨论】:

    猜你喜欢
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多