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
3 Réponses :
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)
Merci akrun aussi existe-t-il une alternative pour la fonction pivot_wider?
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')
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
Double possible de Transposer / remodeler le dataframe sans "timevar" de format long à large