1
votes

diviser les colonnes par caractère dans la liste des blocs de données

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.

r

0 commentaires

3 Réponses :


2
votes

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


0 commentaires

0
votes

Voici une solution qui s'appuie sur tstrsplit de

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)


0 commentaires

0
votes

É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.


0 commentaires