动机
这个问题是在我开发这个解决方案时出现的,这是我在此处arrange_groups_4()
回答的几个解决方案之一。为了寻求一种极其有效的方法来重新排列组内的行,我转向了更强大的性能,并且我将速度提高了近一个数量级!dtplyr
到目前为止,一切都很好。现在当我使用我的arrange_groups_4()
功能时df
library(dplyr)
df %>%
group_by(Grp_1, Grp_2, Grp_3, Grp_4) %>%
arrange_groups_4(Srt_1, Srt_2, Srt_3, Srt_4)
它确实产生了适当dtplyr_step
的输出。注意分组在df
名义上是如何保留的:
Source: local data table [1,000,000 x 9]
Groups: Grp_1, Grp_2, Grp_3, Grp_4
Call: copy(`_DT404`)[, `:=`(c("Record_ID", "Srt_1", "Srt_2", "Srt_3",
"Srt_4"), {
Record_ID <- Record_ID[i = order(Srt_1, Srt_2, Srt_3, Srt_4)]
Srt_1 <- Srt_1[i = order(Srt_1, Srt_2, Srt_3, Srt_4)]
Srt_2 <- Srt_2[i = order(Srt_1, Srt_2, Srt_3, Srt_4)]
Srt_3 <- Srt_3[i = order(Srt_1, Srt_2, Srt_3, Srt_4)]
Srt_4 <- Srt_4[i = order(Srt_1, Srt_2, Srt_3, Srt_4)]
.(Record_ID, Srt_1, Srt_2, Srt_3, Srt_4)
}), by = .(Grp_1, Grp_2, Grp_3, Grp_4)]
Record_ID Grp_1 Grp_2 Grp_3 Grp_4 Srt_1 Srt_2 Srt_3 Srt_4
<int> <chr> <chr> <chr> <chr> <int> <int> <int> <int>
1 791000 f i n y 555 1447234 2881025 3216641
2 661135 a g m w 901 1430325 2719707 3935002
3 744389 d g p v 865 1604458 2878315 3285018
4 699377 a g r x 3148 1939924 2086610 3979005
5 971755 b g p x 1915 1525862 2931457 3041845
6 225865 e k q s 137 1700238 2068752 3426129
# ... with 999,994 more rows
# Use as.data.table()/as.data.frame()/as_tibble() to access results
问题
as_tibble()
不幸的是,当我在dplyr
工作流程中使用“访问结果”时
df %>%
group_by(Grp_1, Grp_2, Grp_3, Grp_4) %>%
arrange_groups_4(Srt_1, Srt_2, Srt_3, Srt_4) %>%
as_tibble()
arrange_groups_4()
或者在它自己的身体里
arrange_groups_4 <- function(.data, ...) {
# ...
# Preceding "dtplyr" pipeline.
# ... |>
dplyr::as_tibble()
}
我得到的只是一个未分组 tibble
的:
# A tibble: 1,000,000 x 9
Record_ID Grp_1 Grp_2 Grp_3 Grp_4 Srt_1 Srt_2 Srt_3 Srt_4
<int> <chr> <chr> <chr> <chr> <int> <int> <int> <int>
1 791000 f i n y 555 1447234 2881025 3216641
2 661135 a g m w 901 1430325 2719707 3935002
3 744389 d g p v 865 1604458 2878315 3285018
4 699377 a g r x 3148 1939924 2086610 3979005
5 971755 b g p x 1915 1525862 2931457 3041845
6 225865 e k q s 137 1700238 2068752 3426129
7 974947 c k o s 6301 1164152 2045629 3465558
8 728230 f k r z 169 1863555 2447881 3351390
9 662906 b h q y 298 1447532 2199384 3359930
10 549039 c l r v 711 1265371 2390559 3749611
# ... with 999,990 more rows
笔记
有趣的是,groups
该对象的属性仍然存在,如对其执行所示:attr
(., "groups")
# A tibble: 1,728 x 5
Grp_1 Grp_2 Grp_3 Grp_4 .rows
<chr> <chr> <chr> <chr> <list<int>>
1 a g m s [588]
2 a g m t [616]
3 a g m u [586]
4 a g m v [558]
5 a g m w [623]
6 a g m x [556]
7 a g m y [614]
8 a g m z [566]
9 a g n s [552]
10 a g n t [605]
# ... with 1,718 more rows
然而正在执行,这应该会产生完全相同的元数据group_data
(.)
定义分组结构的数据框。这些列给出了分组变量的值。最后一列,总是称为
.rows
,是一个整数向量列表,它给出了每组中行的位置。
而是给了我这个(不存在的)“分组”:
# A tibble: 1 x 1
.rows
<list<int>>
1 [1,000,000]
问题
我怎样才能将它转换dtplyr_step
回一个分组 tibble
,它无缝地融入dplyr
工作流程,而不牺牲通过获得的性能dtplyr
?