我很好奇是否有办法将dplyr的 do
函数传递给附加参数的向量,这些参数将依次应用于每个组?例如,考虑是否要将 mtcars
数据集按其 cyl
变量进行分组,并将 head
函数应用于结果组(分别为4,6和8),其中n = 1表示4组,n = 2表示6组,8组n = 3,将最终结果合并到一个数据帧中 .
我可以使用 mapply
完成此操作,如下所示:
temp <- mtcars %>%
split(mtcars$cyl) %>%
mapply(FUN = head, x = ., n = 1:3, SIMPLIFY = FALSE)
rbind(temp[[1]], temp[[2]], temp[[3]])
我很好奇是否有与dplyr相同的方法吗?我到目前为止,但是如何传递 head
是一个额外的参数,表示我们想要选择的行数:
# only selects first row of each group
mtcars %>%
group_by(cyl) %>%
do(data.frame(head(x = ., n = 1)))
# throws an error because n expects a single number
mtcars %>%
group_by(cyl) %>%
do(data.frame(head(x = ., n = 1:3)))
4 回答
没有分组也可以这样做,
更直接地回答关于
do
的问题,因为它的实现方式(通过子集在循环中计算表达式),使得head
函数工作的一种方法是让它在每次调用时递增一个变量 .首先,在data.frame中形式化这个概念:
然后你可以合并它:
我也会考虑躲避额外的括号
当其他dplyr函数不能胜任工作时,
do
仅作为hack存在,应该避免 .嗯,我敢打赌,这是一种更优雅的方式,但是:
会像这样的工作 . 这个解决方案特定于mtcars示例,但是这样的事情可能适用于您的情况 . 它涉及创建自己的函数,该函数具有基于您正在分组的列的条件语句: