0
votes

Pour chaque identifiant, séparez des groupes en colonnes et effondrez plusieurs chaînes de valeur dans R

J'ai un fichier de données qui ressemble à ceci: xxx pré>

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


0 commentaires

4 Réponses :


0
votes

Nous pouvons effondrer val par ID et dB , puis utiliser pivot_wider . xxx


0 commentaires

0
votes

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


0 commentaires

0
votes

Nous pouvons également utiliser spread avec str_c xxx


0 commentaires

1
votes

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


0 commentaires