2016-02-05 2 views
1

Je suis confronté à ce problème dans R dans lequel je veux diviser les chaînes sur virgule, puis diviser davantage sur le point-virgule, mais ne conserver que le premier point avant le point-virgule, c'est-à-dire ee et jj ci-dessous. J'ai essayé beaucoup de choses mais les listes imbriquées semblent trop alambiquées!R strsplit, listes imbriquées blues

est ici ce que je fais:

d <- c("aa,bb,cc,dd,ee;e,ff", 
     "gg,hh,ii,jj;j") 

e=strsplit(d,",") 
myfun2 <- function(x,arg1) { 
strsplit(x,";") 
} 
f=lapply(e,myfun2) 
f= 
[[1]] 
[[1]][[1]] 
[1] "aa" 

[[1]][[2]] 
[1] "bb" 

[[1]][[3]] 
[1] "cc" 

[[1]][[4]] 
[1] "dd" 

[[1]][[5]] 
[1] "ee" "e" 

[[1]][[6]] 
[1] "ff" 

[[2]] 
[[2]][[1]] 
[1] "gg" 

[[2]][[2]] 
[1] "hh" 

[[2]][[3]] 
[1] "ii" 

[[2]][[4]] 
[1] "jj" "j" 

est ici la sortie que je veux

Correct output= 
[[1]] 
[1] "aa" "bb" "cc" "dd" "ee" "ff" 

[[2]] 
[1] "gg" "hh" "ii" "jj" 

J'ai essayé un tas de choses en utilisant lapply à la liste imbriquée « f » et utilisé « [ ["et" ["mais sans succès.

Toute aide est grandement appréciée. (Je sais que je manque quelque chose de stupide, mais je ne peux pas comprendre en ce moment!)

Répondre

1

C'est votre code

d <- c("aa,bb,cc,dd,ee;e,ff", "gg,hh,ii,jj;j") 
e <- strsplit(d,",") 
myfun2 <- function(x,arg1) { strsplit(x,";") } 
f <- lapply(e,myfun2) 

Si nous partons de votre f, l'étape suivante serait

lapply(f,function(x) mapply(`[`,x,1)) 
 
[[1]] 
[1] "aa" "bb" "cc" "dd" "ee" "ff" 

[[2]] 
[1] "gg" "hh" "ii" "jj" 

Fondamentalement, vous avez besoin d'un type intérieur et extérieur appliquer la fonction pour descendre les deux niveaux d'imbrication.

+0

Parfait! C'était juste ce que je voulais. N'a jamais utilisé mapply! –

2

Nous pouvons utiliser gsub pour correspondre au modèle ; suivi d'un minerai caractères plus alphabétiques, remplacez-les par '', puis divisé (strsplit) avec ,.

strsplit(gsub(';[a-z]+', '', d), ',') 
#[[1]] 
#[1] "aa" "bb" "cc" "dd" "ee" "ff" 

#[[2]] 
#[1] "gg" "hh" "ii" "jj" 
+0

Merci! Oui, j'ai essayé gsub. L'exemple ci-dessus est un exemple stylisé. En fait, je peux avoir des chaînes de "aa __; bb __; zz__" et ainsi de suite et certains d'entre eux ne doivent même pas être un alphabet et peuvent être numériques. Ainsi, le motif regex à correspondre peut être vraiment complexe. –

+0

Ok. Je m'excuse. Je pense que je vais comprendre l'expression rationnelle pertinente pour la tâche et accepter votre réponse. Merci! –

+0

@BladeRunner C'est bon. Si vous pouvez montrer un exemple et mettre à jour dans le post, je vais essayer d'y répondre. – akrun