我有一个查询,其中有多个group-by - summarise语句。当我取消分组数据时,一切都正常,但如果我不这样做,其中一个列将被另一个列替换。
我希望列不会改变。例如,在下面的示例中,变量gender
应该是F
或M
,而不是Group X
library(dplyr)
library(arrow)
# Create sample dataset
N <- 1000
set.seed(123)
orig_data <- tibble(
code_group = sample(paste("Group", 1:2), N, replace = TRUE),
year = sample(2015:2016, N, replace = TRUE),
gender = sample(c("F", "M"), N, replace = TRUE),
value = runif(N, 0, 10)
)
write_dataset(orig_data, "example")
# Query and replicate the error
(ds <- open_dataset("example/"))
#> FileSystemDataset with 1 Parquet file
#> code_group: string
#> year: int32
#> gender: string
#> value: double
ds |>
group_by(year, code_group, gender) |>
summarise(value = sum(value)) |>
group_by(code_group, gender) |>
summarise(value = max(value), NN = n()) |>
collect()
#> # A tibble: 2 × 4
#> # Groups: code_group [2]
#> code_group gender value NN
#> <chr> <chr> <dbl> <int>
#> 1 Group 1 Group 1 724. 4
#> 2 Group 2 Group 2 661. 4
错误:性别变量被组变量的值替换。
ds |>
group_by(year, code_group, gender) |>
summarise(value = sum(value)) |>
ungroup() |> #< Added this line...
group_by(code_group, gender) |>
summarise(value = max(value), NN = n()) |>
collect()
#> # A tibble: 4 × 4
#> # Groups: code_group [2]
#> code_group gender value NN
#> <chr> <chr> <dbl> <int>
#> 1 Group 1 F 724. 2
#> 2 Group 2 M 627. 2
#> 3 Group 1 M 658. 2
#> 4 Group 2 F 661. 2
注意现在在按组汇总调用之间插入ungroup()
后,性别不会被替换。
快速查看查询(请注意第4个节点,其中"gender": code_group
)
ds |>
group_by(year, code_group, gender) |>
summarise(value = sum(value)) |>
group_by(code_group, gender) |>
summarise(value = max(value), NN = n()) |>
show_query()
#> ExecPlan with 8 nodes:
#> 7:SinkNode{}
#> 6:ProjectNode{projection=[code_group, gender, value, NN]}
#> 5:GroupByNode{keys=["code_group", "gender"], aggregates=[
#> hash_max(value, {skip_nulls=false, min_count=0}),
#> hash_sum(NN, {skip_nulls=true, min_count=1}),
#> ]}
#> 4:ProjectNode{projection=[value, "NN": 1, code_group, "gender": code_group]}
#> 3:ProjectNode{projection=[year, code_group, gender, value]}
#> 2:GroupByNode{keys=["year", "code_group", "gender"], aggregates=[
#> hash_sum(value, {skip_nulls=false, min_count=0}),
#> ]}
#> 1:ProjectNode{projection=[value, year, code_group, gender]}
#> 0:SourceNode{}
由reprex包(v2.0.1)于2022-12-07创建
我对arrow/dplyr的理解有误吗?还是这是一个错误(如果是,那么它在arrow或dplyr/dbplyr中)?