2 votes

Étendre un cadre de données et réétiqueter les noms des colonnes

Probablement un tidyr ou un reshape2 question.

J'ai ce type de data.frame :

df <- data.frame(group = c("A","B","C","D"),
                 id1 = c("AV14D","BV29",NA,NA),
                 id2 = c(NA,"BD1",NA,NA),
                 id3 = c("AJ31","BJ1",NA,NA),
                 n = c(2,4,NA,NA),
                 stringsAsFactors = F)

qui a une ligne avec 3 ID et un compte pour chaque groupe.

Je veux le transformer en une seule ligne data.frame avec #groupes x 4 ( id1 , id2 , id3 , n ), où chaque groupe a 4 colonnes : <group>_id1 , <group>_id2 , <group>_id3 y <group>_n et les valeurs correspondantes.

Donc le résultat data.frame le sera :

data.frame(A_id1 = "AV14D",A_id2 = NA,A_id3 = "AJ31",A_n = 2,
           B_id1 = "BV29",B_id2 = "BD1",B_id3 = "BJ1",B_n = 4,
           C_id1 = NA,C_id2 = NA,C_id3 = NA,C_n = NA,
           D_id1 = NA,D_id2 = NA,D_id3 = NA,D_n = NA,
           stringsAsFactors = F)

3voto

akrun Points 148302

Nous pouvons utiliser pivot_wider après avoir créé une colonne d'index de ligne

library(dplyr)
library(tidyr)
library(stringr)
out1 <- df %>%
  mutate(rn = 1) %>% 
  pivot_wider(names_from = group, values_from = id1:n,
        names_glue = "{group}_{.value}") %>% 
  select(order(str_remove(names(.), "_.*")), -rn) %>%
  type.convert(as.is = TRUE)

-Vérification avec les résultats de l'OP

> all.equal(out, out1, check.attributes = FALSE)
[1] TRUE

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X