J'ai un fichier de données qui ressemble à ceci: Je veux transformer "db" en colonnes et prendre les valeurs de chaîne et s'effondrer par ";" P> out.dat <- data.frame(ID = c("A1", "B1"),
bio = c("IPR1;IPR2", "IPR7;IPR8"),
func = c("s47", "q87"),
loc = c("333-456", "566-900"))
> out
ID bio func loc
1 A1 IPR1;IPR2 s47 333-456
2 B1 IPR7;IPR8 q87 566-900
4 Réponses :
Nous pouvons effondrer val code> par
ID code> et
dB code>, puis utiliser
pivot_wider code>.
Vous pouvez utiliser dcast code> pour le faire.
in.dat <- data.frame(ID = c("A1", "A1", "A1", "A1", "B1", "B1", "B1", "B1"),
DB = rep(c("bio", "bio", "func", "loc"), 2),
val = c("IPR1", "IPR2", "s43", "333-456",
"IPR7", "IPR8", "q87", "566-900"))
library(reshape2)
dcast(in.dat, ID ~ DB, paste0, collapse = ";")
# ID bio func loc
#1 A1 IPR1;IPR2 s43 333-456
#2 B1 IPR7;IPR8 q87 566-900
Nous pouvons également utiliser spread code> avec
str_c code>
pivot_wider code> Dans récent
TidyR code> Les versions prend un argument
valse_fn code> pour une fonction qui prévoit des valeurs avant de remodeler. Cela vous permet de faire votre opération dans un appel de fonction.
library(tidyr)
in.dat %>%
pivot_wider(names_from = DB, values_from = val,
values_fn = list(val = ~paste(., collapse = ";")))
#> # A tibble: 2 x 4
#> ID bio func loc
#> <fct> <chr> <chr> <chr>
#> 1 A1 IPR1;IPR2 s43 333-456
#> 2 B1 IPR7;IPR8 q87 566-900