合并和分组数据框中的列以创建摘要列的有效方法

ram*_*men 5 r dataframe dplyr

我有以下数据框:

df1 <- structure(list(group = c("KO", "WT", "KO", "KO", "KO", "KO", 
"WT", "KO", "KO", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
"WT", "WT", "KO", "KO"), name = c("rike", "rabe", "smake", "rike", 
"rike", "rike", "rabe", "rike", "rike", "due", "rabe", "ene", 
"ene", "due", "ene", "rabe", "due", "rabe", "due", "smake", "kum"
), type = c("C", "A", "A", "A", "C", "B", "A", "B", "B", "A", 
"B", "A", "C", "C", "C", "C", "B", "C", "A", "C", "A"), posit = c(10, 
2, 21, 5, 12, 22, 18, 19, 81, 22, 33, 31, 80, 40, 16, 16, 7, 
9, 26, 27, 7)), row.names = c(NA, -21L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

我想以这种方式组合两列,一个字符(“类型”)和一个数字(“位置”),所有类别(字母)都将与相应的位置(数字)连接,例如“A”和“37”作为“A37”以及给定“名称”的所有类型位置对都将以升序(从较小的值到较大的值)粘贴到新列中。我还希望它们用“:”分隔。期望的输出如下:

df2 <-structure(list(group = c("WT", "WT", "WT", "KO", "KO", "KO"), 
    name = c("ene", "due", "rabe", "kum", "rike", "smake"), type_posit = c("C16:A31:C80", 
    "B7:A22:A26:C40", "A2:C9:C16:A18:B33", "A7", "A5:C10:C12:B19:B22:B81", 
    "A21:C27")), class = "data.frame", row.names = c(NA, -6L))
Run Code Online (Sandbox Code Playgroud)

我可以通过使用一组 dplyr 函数并创建中间数据帧来实现此目的,如下所示:

df2 <- df1 %>% 
  dplyr::mutate(t_p = paste0(type,posit)) %>% 
  dplyr::arrange(name,posit) %>% 
  dplyr::select(-type, -posit) %>% 
  dplyr::group_by(group, name) %>% 
  dplyr::summarise(tag_pos =paste0(t_p, collapse = ":"))
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更有效和/或更清洁的方法来做到这一点?我想编写干净、易于理解的代码。

Dar*_*sai 3

您需要对行进行排序posit,然后用 汇总每个组paste0(..., collapse = \':\')

\n
library(dplyr)\n\ndf1 %>%\n  group_by(group, name) %>%\n  arrange(posit, .by_group = TRUE) %>% \n  summarise(type_posit = paste0(type, posit, collapse = \':\'), .groups = \'drop\')\n\n# # A tibble: 6 \xc3\x97 3\n#   group name  type_posit            \n#   <chr> <chr> <chr>                 \n# 1 KO    kum   A7                    \n# 2 KO    rike  A5:C10:C12:B19:B22:B81\n# 3 KO    smake A21:C27               \n# 4 WT    due   B7:A22:A26:C40        \n# 5 WT    ene   C16:A31:C80           \n# 6 WT    rabe  A2:C9:C16:A18:B33\n
Run Code Online (Sandbox Code Playgroud)\n