2017-10-13 7 views
0

J'ai une liste de chaînes de caractères où il y a des répétitions dans certaines des chaînes. Par exemple:lapply pas d'itération à travers la liste dans R

[[1]] 
    [1] "gr gal gr gal" 

    [[2]] 
    [1] "gr gal" 

    [[3]] 
    [1] "gr gal ir ol" 

    [[4]] 
    [1] "gr gal gr gal" 

    [[5]] 
    [1] "gr gal" 

Ma sortie désirée est:

[[1]] 
    [1] "gr gal" 

    [[2]] 
    [1] "gr gal" 

    [[3]] 
    [1] "gr gal ir ol" 

    [[4]] 
    [1] "gr gal" 

    [[5]] 
    [1] "gr gal" 

Lorsque les répétitions sont retirées de la chaîne.

Mon plan consiste à appeler strsplit (x, split = ""), puis à appeler la fonction unique sur l'objet scindé. Si je le fais le choix de 1 membre de la liste, mon code fonctionne très bien:

> strsplit(pathmd1[[76]], split = " ") 
    [[1]] 
    [1] "gr" "gal" "gr" "gal" 

    > splittest <- strsplit(pathmd1[[76]], split = " ") 
    > unique(unlist(splittest)) 
    [1] "gr" "gal" 

Cependant, lors de l'utilisation à l'aide lapply ces fonctions, une erreur est renvoyée

pathmd2 <- lapply(1:length(pathmd1), function(i) strsplit(pathmd1[[i]], 
       split = " ")) 
    pathmd <- lapply(1:length(pathmd2), function(i) unique(pathmd2[[i]]) 

    unexpected symbol 
    77: pathmd2 <- lapply(1:length(pathmd1), function(i) 
     strsplit(pathmd1[[i]], split = " ") 
    78: pathmd 
     ^

Pourquoi pas la fonction travailler avec lapply?

+2

Je pense que vous obtenez l'erreur indiquée parce que vous avez oublié un «) » à la fin de votre appel 'strsplit' dans cet exemple –

+0

Les paren de suivi manquantes est à la fin de la commande 'pathmd <- ...', pas la commande 'strsplit'. – r2evans

+0

strsplit donne une sortie de liste, même en passant une seule chaîne. Envisagez de refondre votre liste dans un vecteur de caractères. La sortie de strsplit sera dans le format attendu. Alors l'appel est simplement: 'lapply (strsplit (charVec, ''), unique)'. – AdamO

Répondre

0

Vous pouvez essayer:

lapply(f, function(x) unique(unlist(strsplit(x, " ")))) 
#output 
[[1]] 
[1] "gr" "gal" 

[[2]] 
[1] "gr" "gal" 

[[3]] 
[1] "gr" "gal" "ir" "ol" 

[[4]] 
[1] "gr" "gal" 

[[5]] 
[1] "gr" "gal" 

où f est votre liste.

il n'y a pas besoin d'itérer comme avec une boucle for