J'ai la liste suivante de trames de données:
> filelist [[1]] x y_ref y_alt1 y_alt2 1 1 1 2 2 2 1 2 3 3 3 1 5 [[2]] x y_ref y_alt2 y_alt3 y_alt4 1 4 1 2 2 5 1 4 3 6 1 6 7 8
Maintenant, je veux diviser chaque colonne «y» par caractère »et stocker la sortie dans de nouvelles colonnes dans la trame de données.
Le résultat doit ressembler à ceci:
df1 <- data.frame(x = 1:3, y=c("1,2","1,2,3","1,5"))
df2 <- data.frame(x = 4:6, y=c("1,2","1,4","1,6,7,8"))
filelist <- list(df1,df2)
> filelist
[[1]]
x y
1 1 1,2
2 2 1,2,3
3 3 1,5
[[2]]
x y
1 4 1,2
2 5 1,4
3 6 1,6,7,8
Comment dois-je faire cela? Je sais qu'il y a «strsplit» pour diviser une chaîne par caractère. Mais je ne vois pas comment je peux stocker la sortie dans différentes colonnes.
3 Réponses :
appliquer cSplit sur la colonne "y" de chaque dataframe dans filelist
lapply(filelist, splitstackshape::cSplit, "y") #[[1]] # x y_1 y_2 y_3 #1: 1 1 2 NA #2: 2 1 2 3 #3: 3 1 5 NA #[[2]] # x y_1 y_2 y_3 y_4 #1: 4 1 2 NA NA #2: 5 1 4 NA NA #3: 6 1 6 7 8
Voici une solution qui s'appuie sur tstrsplit de data.table
library(data.table)
lapply(filelist,
function(DF) {
commas = max(nchar(as.character(DF$y)) -nchar( gsub(",", "", DF$y)))
DF[, c('y_ind', paste0('y_alt', seq_len(commas)))] = tstrsplit(as.character(DF$y), ',')
DF
})
#> [[1]]
#> x y y_ind y_alt1 y_alt2
#> 1 1 1,2 1 2 <NA>
#> 2 2 1,2,3 1 2 3
#> 3 3 1,5 1 5 <NA>
#>
#> [[2]]
#> x y y_ind y_alt1 y_alt2 y_alt3
#> 1 4 1,2 1 2 <NA> <NA>
#> 2 5 1,4 1 4 <NA> <NA>
#> 3 6 1,6,7,8 1 6 7 8
Créé le 17/09/2019 par package reprex (v0.3.0)
Également avec dplyr , vous pouvez utiliser separ () comme ceci:
df %>% separate(y, into = c(y_ind,y_alt1,...), sep = ",")
Notez que into peut également être utilisé plus "par programmation "pour générer la quantité nécessaire de colonnes résultantes avec une indexation correcte sans définir manuellement chaque colonne de résultat.