首页 > 解决方案 > 使用 dplyr / magrittr 传递分组的 data.frame

问题描述

使用base::by()and data.table,我们可以按变量分组,然后能够访问作为分组子集的 data.frame。如何使用进行等效操作?

我尝试过tib %>% group_by(grp) %>% mutate(V2 = fx(.)),但不是通过子组,而是通过tibbleLHS 中的整个分组。这是一个 MRE:

library(dplyr)
tib = tibble(grp = rep(1:2, 1:2),
             V1 = 1:3)
tib
#> # A tibble: 3 x 2
#>     grp    V1
#>   <int> <int>
#> 1     1     1
#> 2     2     2
#> 3     2     3

fx = function(x){
  ans = seq(nrow(x))
  print(ans)
}

tib %>%
  group_by(grp)%>%
  mutate(V2 = fx(.))
#> [1] 1 2 3
#> Error: Problem with `mutate()` input `V2`.
#> x Input `V2` can't be recycled to size 1.
#> i Input `V2` is `fx(.)`.
#> i Input `V2` must be size 1, not 3.
#> i The error occured in group 1: grp = 1.

这是我希望使用的行为:

library(data.table)
as.data.table(tib)[, V2 := fx(.SD), grp][]
#> [1] 1
#> [1] 1 2
#>      grp    V1    V2
#>    <int> <int> <int>
#> 1:     1     1     1
#> 2:     2     2     1
#> 3:     2     3     2

标签: rdplyrmagrittr

解决方案


您可以cur_data()dplyr1.0.0 开始使用。

library(dplyr)
tib %>% group_by(grp)%>% mutate(V2 = fx(cur_data()))

#[1] 1
#[1] 1 2
# A tibble: 3 x 3
# Groups:   grp [2]
#    grp    V1    V2
#  <int> <int> <int>
#1     1     1     1
#2     2     2     1
#3     2     3     2

请注意,cur_data()传递数据时不分组变量 ( grp)。如果你想分组变量应该传递给函数使用cur_data_all()


推荐阅读