2016-11-04 2 views
1

J'ai i df suivant nommé:application str_split à une colonne dans dataframe

structure(list(price = c(11772, 14790, 2990, 1499, 21980, 27999 
), fuel = c("diesel", "petrol", "petrol", "diesel", "diesel", 
"petrol"), gearbox = c("manual", "manual", "manual", "manual", 
"automatic", "manual"), colour = c("white", "purple", "yellow", 
"silver", "red", "rising blue metalli"), engine_size = c(1685, 
1199, 998, 1753, 2179, 1984), mileage = c(18839, 7649, 45058, 
126000, 31891, 100), year = c("2013 hyundai ix35", "2016 citroen citroen ds3 cabrio", 
"2007 peugeot 107 hatchback", "2007 ford ford focus hatchback", "2012 jaguar xf saloon", 
"2016 volkswagen scirocco coupe"), doors = c(5, 2, 3, 5, 4, 3 
)), .Names = c("price", "fuel", "gearbox", "colour", "engine_size", 
"mileage", "year", "doors"), row.names = c(NA, 6L), class = "data.frame") 

Certains des mots dans la colonne « année » sont dupliquées. Je voudrais les enlever. Dans un premier temps, je voudrais séparer la chaîne de caractères dans cette colonne dans des mots séparés. j'ai pu le faire pour une chaîne séparée, mais lorsque je tente de l'appliquer à l'ensemble de trame de données lui donne une erreur

unlist(str_split("2013 hyunday ix35", "[[:blank:]]")) 

[1] « 2013 » « Hyunday » « ix35 »

for(k in 1:nrow(i)) 
+ i[k,7]<-unlist(str_split(i[k, 7], "[[:blank:]]")) 

erreur dans [<-.data.frame (*tmp*, k, 7, valeur = c ("2013", "hyundai": remplacement a 3 rangées, les données ont une

Répondre

2

on peut diviser par un ou plusieurs espace (\\s+), et paste e unique éléments entre eux par une boucle à travers la sortie list (sapply(..)

i$year <- sapply(strsplit(i$year, "\\s+"), function(x) paste(unique(x), collapse=' ')) 
+1

Il fonctionne très bien . J'ai essayé d'utiliser sapply, mais je ne savais pas comment combiner deux fonctions (coller et unique) ensemble. – Vasile

2

Travailler avec dplyr et stringr (avec l'aide de purrr pour travailler avec la liste), vous pouvez le faire:

library(dplyr) 
df %>% 
    mutate(newyear = purrr::map_chr(
    stringr::str_split(year, pattern = "[[:blank:]]"), 
    ~ paste(unique(.x), collapse = " ") 
    )) 
#> price fuel gearbox    colour engine_size mileage 
#> 1 11772 diesel manual    white  1685 18839 
#> 2 14790 petrol manual    purple  1199 7649 
#> 3 2990 petrol manual    yellow   998 45058 
#> 4 1499 diesel manual    silver  1753 126000 
#> 5 21980 diesel automatic     red  2179 31891 
#> 6 27999 petrol manual rising blue metalli  1984  100 
#>        year doors      newyear 
#> 1    2013 hyundai ix35  5    2013 hyundai ix35 
#> 2 2016 citroen citroen ds3 cabrio  2  2016 citroen ds3 cabrio 
#> 3  2007 peugeot 107 hatchback  3  2007 peugeot 107 hatchback 
#> 4 2007 ford ford focus hatchback  5  2007 ford focus hatchback 
#> 5   2012 jaguar xf saloon  4   2012 jaguar xf saloon 
#> 6 2016 volkswagen scirocco coupe  3 2016 volkswagen scirocco coupe 
+0

C'est génial. J'ai eu de vrais problèmes ... pouvez-vous expliquer ce que fait la partie '~ paste (unique ...' et comment avez-vous su utiliser cela? –