0

动机

这个问题是在我开发这个解决方案时出现的,这是我在此处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

4

0 回答 0