2017-09-11 2 views
-1

J'ai essayé de chercher le problème R mais je n'ai rien trouvé d'utile.Comment obtenir toutes les commandes possibles de chaînes séparées par des virgules

J'ai un dataframe comme ceci:

Post_ID New_Mentions_1  New_Mentions_2 
    1   model      
    2  telephone   louis vuitton 
    3   uber   employee 
    4 united states      
    5   onion   pepper, rice, garlic 

Et mon résultat attendu est l'élargissement du dataframe avec tous les ordres possibles de New_Mention_2

Post_ID New_Mentions_1  New_Mentions_2 
    1   model      
    2  telephone   louis vuitton 
    3   uber   employee 
    4 united states      
    5   onion  pepper,rice,garlic 
    5   onion  rice,garlic,pepper 
    5   onion  garlic,pepper,rice 
    5   onion  pepper,garlic,rice 
    5   onion  garlic,rice,pepper 
    5   onion  rice,pepper,garlic 

S'il vous plaît me aider avec un programme pour cela. J'ai aussi quelques lignes avec 5 mots-clés séparés par des virgules.

+1

Ceci est une exigence curieuse. Pourquoi avez-vous besoin de toutes les permutations possibles de ces éléments? –

Répondre

0

Il devrait y avoir un moyen plus facile de gérer cela, mais je n'arrive pas à le trouver.

Pour nous assurer que nous parlons de la même trame de données, republier vos données:

df <- structure(list(New_Mentions_1 = c("model", "telephone", "uber", 
     "united_states", "onion"), New_Mentions_2 = c(NA, "louis_vuitton", 
     "employee", NA, "pepper,rice,garlic")), .Names = c("New_Mentions_1", 
     "New_Mentions_2"), class = "data.frame", row.names = c(NA, -5L)) 

D'abord, vous vérifiez les lignes en df ont plusieurs valeurs dans la colonne New_Mentions_2, en utilisant grep. Cette fonction renvoie les lignes dans lesquelles votre deuxième colonne contient une valeur de virgule. Ensuite, nous divisons la trame de données dans la partie qui n'a pas besoin d'être réparée (c'est-à-dire n'a pas de valeur de virgule dans la deuxième colonne) et appelons-la newdf. La partie à réparer est appelée subdf.

Nous allons mess (détails ci-dessous le code) un peu avec subdf pour obtenir toutes les combinaisons possibles des valeurs et ajouter les résultats à la trame de données newdf:

library(gtools) 
# Which rows in df have multiple values in the second column? 
inds <- grep(pattern = ",", df$New_Mentions_2) 

subdf <- df[inds, ] 
newdf <- df[-inds, ] 

# Just in case you have multiple 'problematic' rows, we'll loop through all of them 
for(i in 1:nrow(subdf)){ 
    splitted <- strsplit(subdf$New_Mentions_2[i], ", ")[[1]] 
    n  <- length(splitted) 
    shuffled <- permutations(n, n) 
    for(j in 1:nrow(shuffled)){ 
    val_2 <- paste(splitted[shuffled[j, ]], collapse = ", ") 
    val_1 <- subdf$New_Mentions_1[i] 
    newdf <- rbind(newdf, c(val_1, val_2)) 
    } 
} 

La partie « déconner » est effectué principalement dans la boucle externe. Premièrement, la valeur de e.g. "poivre, riz, ail" est divisé pour chaque , (virgule + espace). splitted contiendra alors c("pepper", "rice", "garlic"), pour lequel nous obtenons toutes les combinaisons possibles en utilisant la fonction permutations du paquet gtools. Dans la première ligne de la boucle interne, les chaînes mélangées seront remises ensemble dans une seule chaîne (paste() avec l'argument collapse = ", ")), de sorte que nous puissions les réintégrer dans une colonne d'une trame de données.