2013-08-13 6 views
0

J'ai plusieurs vecteurs de caractères que je veux coller ensemble. Le problème est que certains des vecteurs de caractères sont assez clairsemés. Donc, quand je les colle, je reçois des NA et des séparateurs supplémentaires. Comment puis-je supprimer efficacement les NA et les séparateurs supplémentaires tout en rejoignant les vecteurs?Collage de vecteurs de caractères, suppression des NA et des séparateurs entre les NA

J'ai quelque chose comme:

n1 = c("goats", "goats", "spatula", NA, "rectitude", "boink") 
n2 = c("forever", NA, "...yes", NA, NA, NA) 
cbind(paste(n1,n2, sep=", ")) 

qui me donne:

[1,] "goats, forever" 
[2,] "goats, NA"  
[3,] "spatula, ...yes" 
[4,] "NA, NA"   
[5,] "rectitude, NA" 
[6,] "boink, NA" 

mais je veux:

[1,] "goats, forever" 
[2,] "goats"   
[3,] "spatula, ...yes" 
[4,] <NA> 
[5,] "rectitude"  
[6,] "boink" 

Il existe des moyens clairement inefficaces et fastidieux de le faire avec beaucoup d'expressions régulières et de fractionnement de ficelles. Mais quelque chose de rapide/simple?

+1

Jetez un oeil à cette question: http://stackoverflow.com/questions/13673894/suppress-nas-in-paste – user1981275

Répondre

5

Pas beaucoup de regex, à seulement 1 ligne et 1 de plus à remplacer NA

n1 <- c("goats", "goats", "spatula", NA, "rectitude", "boink") 
n2 <- c("forever", NA, "...yes", NA, NA, NA) 
n3 <- cbind(paste(n1,n2, sep=", ")) 
n3 <- gsub("(,)?NA", "", n3) 
n3[n3==""] <- NA 
5

code (pas regex ou division string):

vec <- apply(cbind(n1,n2),1,function(x) 
    ifelse(all(is.na(x)), NA, paste(na.omit(x),collapse=", "))) 

Résultat:

> veC# as a vector 
[1] "goats, forever" "goats" "spatula, ...yes" NA "rectitude" "boink" 

> cbind(vec) # as a matrix 
    vec    
[1,] "goats, forever" 
[2,] "goats"   
[3,] "spatula, ...yes" 
[4,] NA    
[5,] "rectitude"  
[6,] "boink" 
1

Voici une option utilisant le paquetage qdap (bien que les autres options me semblent mieux car ils utilisent la base R):

library(qdap) 
gsub(" ", ", ", blank2NA(Trim(gsub("NA", "", paste(n1, n2))))) 

## [1] "goats, forever" "goats"   "spatula, ...yes" NA    
## [5] "rectitude"  "boink" 

Ou ...

## gsub(" ", ", ", blank2NA(gsub("NA| NA", "", paste(n1, n2)))) 
Questions connexes