I have a following dataframe:
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")
I would like to combine 2 columns, one character ("type") and one numeric ("posit") in that manner, that all of categories (letters) would be joined with corresponding posits (numbers), for instance "A" and "37" as "A37" and all of the type-posit pairs for given "name" would be pasted in new column in ascending order (from lesser to bigger values). Also I'd like them to be separated with ":". The desired output is given below:
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))
I can achieve this by using set of dplyr functions, and creating intermediate dataframes, like this:
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 = ":"))
However I wonder, whether there is more efficient and/or cleaner way to do so? I would like to write a clean, understandable code.