【问题标题】:pass grouped dataframe to own function in dplyr将分组的数据框传递给 dplyr 中的自己的函数
【发布时间】:2015-03-27 20:57:24
【问题描述】:

我正在尝试从 plyr 转移到 dplyr。但是,我似乎仍然无法弄清楚如何在链式 dplyr 函数中调用自己的函数。

我有一个带有分解 ID 变量和顺序变量的数据框。我想按 ID 拆分框架,按 order 变量对其进行排序并在新列中添加一个序列。

我的 plyr 函数如下所示:

f <- function(x) cbind(x[order(x$order_variable), ], Experience = 0:(nrow(x)-1))
data <- ddply(data, .(ID_variable), f)

在 dplyr 中,我虽然看起来应该是这样的

f <- function(x) cbind(x[order(x$order_variable), ], Experience = 0:(nrow(x)-1))
data <- data %>% group_by(ID_variable) %>% f

谁能告诉我如何修改我的 dplyr 调用以成功传递我自己的函数并获得我的 plyr 函数提供的相同功能?

编辑:如果我使用此处描述的 dplyr 公式,它确实将一个对象传递给 f。然而,虽然 plyr 似乎传递了许多不同的表(由 ID 变量分割),但 dplyr 不会传递每个组一个表,而是传递整个表(作为某种 dplyr 对象,其中组被注释),因此当我 cbind经验变量它将一个从 0 的计数器附加到整个表的长度而不是单个组的长度。

我找到了一种使用这种方法在 dplyr 中获得相同功能的方法:

data <- data %>%
    group_by(ID_variable) %>%
    arrange(ID_variable,order_variable) %>% 
    mutate(Experience = 0:(n()-1))

但是,我仍然很想学习如何将分组变量拆分到不同的表中传递给 dplyr 中的自己的函数。

【问题讨论】:

  • 您使用的是什么版本的 R 和 dplyr?这对我来说没有产生错误。
  • 我认为我们需要一个可重现的数据集。 @nrussell我不认为这个问题是抛出的错误,而不是预期/预期的结果。由于我自己的类似问题,我发现了这个问题。我做了一些非常相似的事情d %&gt;% group_by(var1, var2) %&gt;% summarize(blah = f(.))。我得到一个返回的组数据框,但“blah”的每个条目都是相同的。我认为如上所述;由于某种原因,整个 df 被传递,而不是像 plyr 这样的分组“块”。

标签: r plyr dplyr


【解决方案1】:

对于那些从谷歌来到这里的人。假设您编写了自己的打印函数。

printFunction <- function(dat) print(dat)
df <- data.frame(a = 1:6, b = 1:2)

这里有人问

df %>% 
    group_by(b) %>% 
    printFunction(.)

打印整个数据。要让 dplyr 打印分组的多个表,您应该使用 do

df %>% 
    group_by(b) %>% 
    do(printFunction(.))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多