如何将 dplyr 的 group_by、mutate、filter、pivot_wider 转换为 data.table 方法

sca*_*der 1 r dplyr data.table

我有以下数据框:

\n
dat <- structure(list(ref_string = c("K", "Y", "Q", "C", "H", "A", "S", \n"Y", "L", "Y"), peptide_name = c("p47", "p666", "p506", "p356", \n"p598", "p458", "p448", "p117", "p232", "p464"), peptide = c("FKDHKHIDVKgrrrskrrrrTRCYHIDPHH", \n"FKDHKHIDVKsrgrkrrrrrTRCYHIDPHH", "FKDHKHIDVKrrrrskrgrrTRCYHIDPHH", \n"FKDHKHIDVKrrrgrrrrskTRCYHIDPHH", "FKDHKHIDVKrsgrrrrrkrTRCYHIDPHH", \n"FKDHKHIDVKrrrrrkrrgsTRCYHIDPHH", "FKDHKHIDVKrrrrrgrskrTRCYHIDPHH", \n"FKDHKHIDVKkrrrrsrrgrTRCYHIDPHH", "FKDHKHIDVKrkrrrrsgrrTRCYHIDPHH", \n"FKDHKHIDVKrrrrrksrrgTRCYHIDPHH"), status = c(0, 0, 0, 0, 0, \n0, 0, 0, 0, 0)), class = c("rowwise_df", "tbl_df", "tbl", "data.frame"\n), row.names = c(NA, -10L), groups = structure(list(.rows = structure(list(\n    1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), ptype = integer(0), class = c("vctrs_list_of", \n"vctrs_vctr", "list"))), row.names = c(NA, -10L), class = c("tbl_df", \n"tbl", "data.frame")))\n
Run Code Online (Sandbox Code Playgroud)\n

它看起来像这样:

\n
# A tibble: 10 \xc3\x97 4\n# Rowwise: \n   ref_string peptide_name peptide                        status\n   <chr>      <chr>        <chr>                           <dbl>\n 1 K          p47          FKDHKHIDVKgrrrskrrrrTRCYHIDPHH      0\n 2 Y          p666         FKDHKHIDVKsrgrkrrrrrTRCYHIDPHH      0\n 3 Q          p506         FKDHKHIDVKrrrrskrgrrTRCYHIDPHH      0\n 4 C          p356         FKDHKHIDVKrrrgrrrrskTRCYHIDPHH      0\n 5 H          p598         FKDHKHIDVKrsgrrrrrkrTRCYHIDPHH      0\n 6 A          p458         FKDHKHIDVKrrrrrkrrgsTRCYHIDPHH      0\n 7 S          p448         FKDHKHIDVKrrrrrgrskrTRCYHIDPHH      0\n 8 Y          p117         FKDHKHIDVKkrrrrsrrgrTRCYHIDPHH      0\n 9 L          p232         FKDHKHIDVKrkrrrrsgrrTRCYHIDPHH      0\n10 Y          p464         FKDHKHIDVKrrrrrksrrgTRCYHIDPHH      0\n
Run Code Online (Sandbox Code Playgroud)\n

目前,我的 dplyr 进程对于真实数据集来说很慢:

\n
library(tidyverse)\ndat %>% \n  dplyr::group_by(peptide_name, peptide) %>% \n  mutate(tot = sum(status)) %>% \n  filter(tot == 0) %>%  \n  pivot_wider(names_from = ref_string, values_from = status) %>%\n  dplyr::select(-tot) %>% \n  ungroup()\n
Run Code Online (Sandbox Code Playgroud)\n

其产生:

\n
# A tibble: 10 \xc3\x97 10\n   peptide_name peptide                            K     Y     Q     C     H     A     S     L\n   <chr>        <chr>                          <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>\n 1 p47          FKDHKHIDVKgrrrskrrrrTRCYHIDPHH     0    NA    NA    NA    NA    NA    NA    NA\n 2 p666         FKDHKHIDVKsrgrkrrrrrTRCYHIDPHH    NA     0    NA    NA    NA    NA    NA    NA\n 3 p506         FKDHKHIDVKrrrrskrgrrTRCYHIDPHH    NA    NA     0    NA    NA    NA    NA    NA\n 4 p356         FKDHKHIDVKrrrgrrrrskTRCYHIDPHH    NA    NA    NA     0    NA    NA    NA    NA\n 5 p598         FKDHKHIDVKrsgrrrrrkrTRCYHIDPHH    NA    NA    NA    NA     0    NA    NA    NA\n 6 p458         FKDHKHIDVKrrrrrkrrgsTRCYHIDPHH    NA    NA    NA    NA    NA     0    NA    NA\n 7 p448         FKDHKHIDVKrrrrrgrskrTRCYHIDPHH    NA    NA    NA    NA    NA    NA     0    NA\n 8 p117         FKDHKHIDVKkrrrrsrrgrTRCYHIDPHH    NA     0    NA    NA    NA    NA    NA    NA\n 9 p232         FKDHKHIDVKrkrrrrsgrrTRCYHIDPHH    NA    NA    NA    NA    NA    NA    NA     0\n10 p464         FKDHKHIDVKrrrrrksrrgTRCYHIDPHH    NA     0    NA    NA    NA    NA    NA    NA\n
Run Code Online (Sandbox Code Playgroud)\n

如何使用data.table获得相同的结果?

\n

我被困在这里:

\n
library(data.table)\ndt <- as.data.table(dat)\ndt[,by = peptide, tot:=sum(status) ]\ndt\n
Run Code Online (Sandbox Code Playgroud)\n

结果如下:

\n
    ref_string peptide_name                        peptide status tot\n 1:          K          p47 FKDHKHIDVKgrrrskrrrrTRCYHIDPHH      0   0\n 2:          Y         p666 FKDHKHIDVKsrgrkrrrrrTRCYHIDPHH      0   0\n 3:          Q         p506 FKDHKHIDVKrrrrskrgrrTRCYHIDPHH      0   0\n 4:          C         p356 FKDHKHIDVKrrrgrrrrskTRCYHIDPHH      0   0\n 5:          H         p598 FKDHKHIDVKrsgrrrrrkrTRCYHIDPHH      0   0\n 6:          A         p458 FKDHKHIDVKrrrrrkrrgsTRCYHIDPHH      0   0\n 7:          S         p448 FKDHKHIDVKrrrrrgrskrTRCYHIDPHH      0   0\n 8:          Y         p117 FKDHKHIDVKkrrrrsrrgrTRCYHIDPHH      0   0\n 9:          L         p232 FKDHKHIDVKrkrrrrsgrrTRCYHIDPHH      0   0\n10:          Y         p464 FKDHKHIDVKrrrrrksrrgTRCYHIDPHH      0   0\n
Run Code Online (Sandbox Code Playgroud)\n

我不知道如何对 data.table 使用filter和pivot_wider。

\n

Tho*_*ing 5

这是一个data.table选项,dcast应该用于更广泛的旋转

dcast(
  setDT(dat)[
    ,
    tot := sum(status),
    .(peptide_name, peptide)
  ][tot == 0],
  peptide_name + peptide ~ ref_string,
  value.var = "status"
)
Run Code Online (Sandbox Code Playgroud)

你会看到结果为

    peptide_name                        peptide  A  C  H  K  L  Q  S  Y
 1:         p117 FKDHKHIDVKkrrrrsrrgrTRCYHIDPHH NA NA NA NA NA NA NA  0
 2:         p232 FKDHKHIDVKrkrrrrsgrrTRCYHIDPHH NA NA NA NA  0 NA NA NA
 3:         p356 FKDHKHIDVKrrrgrrrrskTRCYHIDPHH NA  0 NA NA NA NA NA NA
 4:         p448 FKDHKHIDVKrrrrrgrskrTRCYHIDPHH NA NA NA NA NA NA  0 NA
 5:         p458 FKDHKHIDVKrrrrrkrrgsTRCYHIDPHH  0 NA NA NA NA NA NA NA
 6:         p464 FKDHKHIDVKrrrrrksrrgTRCYHIDPHH NA NA NA NA NA NA NA  0
 7:          p47 FKDHKHIDVKgrrrskrrrrTRCYHIDPHH NA NA NA  0 NA NA NA NA
 8:         p506 FKDHKHIDVKrrrrskrgrrTRCYHIDPHH NA NA NA NA NA  0 NA NA
 9:         p598 FKDHKHIDVKrsgrrrrrkrTRCYHIDPHH NA NA  0 NA NA NA NA NA
10:         p666 FKDHKHIDVKsrgrkrrrrrTRCYHIDPHH NA NA NA NA NA NA NA  0
Run Code Online (Sandbox Code Playgroud)