【发布时间】: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 %>% group_by(var1, var2) %>% summarize(blah = f(.))。我得到一个返回的组数据框,但“blah”的每个条目都是相同的。我认为如上所述;由于某种原因,整个 df 被传递,而不是像plyr这样的分组“块”。