dplyr中的plyr::ddply等价函数

4

在学习 dplyr 之前,我个人先学了 plyr。现在我正在尝试在可能的情况下将我的代码规范化为 dplyr 语法,但是我遇到了以下使用案例:

ddply(
    .data = somedataframe, 
    .variables = c('var1', 'var2'),
    .function = 
        function(thisdf){
            ...
        }
)

在函数调用中,... 表示对数据框进行任意复杂的修改。需要注意的是,选择使用 ddply 还是 dlply(或其他任何 dxply)仅为举例说明。是否存在一个在 dplyr 中的函数(暂且称之为 dplyr::f),可以接受任意的修改函数?例如:

somedataframe %>% 
    group_by(var1, var2) %>% 
    dplyr::f(.function = function(thisdf){ ... })

在我对这个功能进行调查时,我发现所有的例子都是非常简单的summarise实现ddply


我认为刚发布的dplyr更新有一些额外的分组动词,比如 group_by_map 尝试覆盖这种情况。 - joran
3
抱歉,这是 group_map ,您可以在 此处 阅读相关内容。在 dplyr 中执行这种操作的旧方法(我认为仍然有效)是使用 do() - joran
如果您想修改数据框,请使用mutate。 - qwr
1
你距离一个可重现的例子并不远,只需要提供一个数据集和一个真实的函数,附上期望的输出,你就能在很短的时间内得到一个很好的答案,并且帮助更多遇到同样问题的人。 - moodymudskipper
@Moody_Mudskipper - Joran在他的评论中已经充分回答了这个问题。 - jameselmore
对于未来的读者来说,拥有可重现的示例和答案仍然是有用的。目前问题的状态对他人并不那么有帮助。 - acylam
1个回答

4

可能最简单的方法是使用 dplyr::do() 函数,但也可以使用 group_modify()。完整示例:

library(tidyverse)

#some complex function
func = function(x) {
  mod = lm(Sepal.Length ~ Petal.Width, data = x)
  mod_coefs = broom::tidy(mod)

  tibble(
    mean_sepal_length = mean(x$Sepal.Length),
    mean_petal_width = mean(x$Petal.Width), 
    slope = mod_coefs[[2, 2]],
    slope_p = mod_coefs[[2, 5]]
  )
}

#plyr version
plyr::ddply(iris, "Species", func)

#dplyr with do()
iris %>% 
  group_by(Species) %>% 
  do(func(.))

#dplyr with group_map()
#have to rewrite the function to take a second argument, which is the grouping variable
func2 = function(x, y) {
  mod = lm(Sepal.Length ~ Petal.Width, data = x)
  mod_coefs = broom::tidy(mod)

  tibble(
    mean_sepal_length = mean(x$Sepal.Length),
    mean_petal_width = mean(x$Petal.Width), 
    slope = mod_coefs[[2, 2]],
    slope_p = mod_coefs[[2, 5]]
  )
}

iris %>% 
  group_by(Species) %>% 
  group_modify(func2)

这些会产生以下结果:

     Species mean_sepal_length mean_petal_width     slope      slope_p
1     setosa             5.006            0.246 0.9301727 5.052644e-02
2 versicolor             5.936            1.326 1.4263647 4.035422e-05
3  virginica             6.588            2.026 0.6508306 4.798149e-02

# A tibble: 3 x 5
# Groups:   Species [3]
  Species    mean_sepal_length mean_petal_width slope   slope_p
  <fct>                  <dbl>            <dbl> <dbl>     <dbl>
1 setosa                  5.01            0.246 0.930 0.0505   
2 versicolor              5.94            1.33  1.43  0.0000404
3 virginica               6.59            2.03  0.651 0.0480   

# A tibble: 3 x 5
# Groups:   Species [3]
  Species    mean_sepal_length mean_petal_width slope   slope_p
  <fct>                  <dbl>            <dbl> <dbl>     <dbl>
1 setosa                  5.01            0.246 0.930 0.0505   
2 versicolor              5.94            1.33  1.43  0.0000404
3 virginica               6.59            2.03  0.651 0.0480   

有2个区别。 ddply() 的输出是标准数据框架,即使函数输出了tibble也是如此。 dplyr 的输出是分组的tibbles,尽管已经使用了分组。

1
当前版本的group_map返回一个tibbles列表。看起来正确的动词是group_modify。 - dk.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接