通过分组 data.frame 使用 dplyr / magrittr
Pass grouped data.frame using dplyr / magrittr
使用 base::by()
和 data.table
,我们可以按变量分组,然后能够访问按组划分的子集 data.frame。我怎样才能用 magrittr or dplyr 做同样的事情?
我试过 tib %>% group_by(grp) %>% mutate(V2 = fx(.))
但点没有传递子组,而是传递了来自 LHS 的整个分组 tibble
。这是一个 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.
这是我希望使用 data.table:
的行为
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
从 dplyr
1.0.0 开始,您可以使用 cur_data()
。
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()
。
使用 base::by()
和 data.table
,我们可以按变量分组,然后能够访问按组划分的子集 data.frame。我怎样才能用 magrittr or dplyr 做同样的事情?
我试过 tib %>% group_by(grp) %>% mutate(V2 = fx(.))
但点没有传递子组,而是传递了来自 LHS 的整个分组 tibble
。这是一个 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.
这是我希望使用 data.table:
的行为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
从 dplyr
1.0.0 开始,您可以使用 cur_data()
。
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()
。