1
votes

Regrouper par colonne aux valeurs de ligne

J'essaie de regrouper les lignes en colonnes. Dans mon dataframe df, je dois regrouper par colonne A1 et obtenir les valeurs B1 respectives dans les nouvelles colonnes mutées X1, X2 et X3.

        A1        X1           X2       X3
1    a is a cat  alpha in   for gamma
2 b is a basket  for beta   alpha in  
3      c for c2  for ceta

Résultat attendu:

df <- data.frame(A1 = c("a is a cat","b is a basket","a is a cat","c for c2","b is a basket"),
                 B1 = c("alpha in","for beta","for gamma","for ceta","alpha in"))
df

        A1        B1
1    a is a cat  alpha in
2 b is a basket  for beta
3    a is a cat for gamma
4      c for c2  for ceta
5 b is a basket  alpha in

r

3 Réponses :


1
votes

Nous créons une séquence regroupée par 'A1' et utilisons pivot_wider

library(dplyr)
library(tidyr)
library(stringr)
df %>%
  group_by(A1) %>%
  mutate(new = str_c("X", row_number())) %>%
  pivot_wider(names_from = new, values_from = B1)


1 commentaires

Merci akrun aussi existe-t-il une alternative pour la fonction pivot_wider?



1
votes

Vous pouvez utiliser data.table:

> library(data.table)
> setDT(df)[,n:=paste0('X',1:.N),by=A1]
> dcast.data.table(df,A1~n,value.var = 'B1')


0 commentaires

0
votes

Solution de base R:

    df <- data.frame(A1 = c("a is a cat","b is a basket","a is a cat","c for c2","b is a basket"),
                 B1 = c("alpha in","for beta","for gamma","for ceta","alpha in"))

Données:

df_new <- setNames(aggregate(list(B1 = df$B1),

                             by = list(df$A1),

                             paste0,

                             collapse = "_-_"),

                   c("A1", "X1"))

df_new <- cbind(A1 = df_new$A1,

                setNames(data.frame(do.call(rbind,

                                            lapply(strsplit(df_new$X1, '\\_\\-\\_'),

                                                   function(x){length(x) = nrow(df_new)

                                                   return(x)

                                                        }
                                                   )
                                            )
                                    ),

         c(paste0("X", 1:nrow(df_new))))

         )
df_new


0 commentaires