Je travaille avec les données de chemin de conversion Google Analytics dans R. Mon cadre de données importé ressemble à l'exemple suivant: Comme vous pouvez le constater, les différents canaux sont séparés par un "> " symbole. Ce que je voudrais faire, c'est ce que je voudrais faire, c'est ce que je voudrais faire, c'est ce que je veux faire: p> remplacer "social" dans la colonne "Channel_Path" de la valeur correspondante dans la colonne "Source_Path" sans modifier d'autres valeurs. Cela devrait arriver à toutes les lignes de l'ensemble de données. P> Le résultat devrait alors ressembler à ce qui suit: p> Le problème que j'ai ici est que je suis Travailler avec un grand jeu de données (60 000 rangées) et que je ne sais pas comment remplacer automatiquement les valeurs en fonction de leur position. P> Pour une meilleure reproducabilité, voici le code de l'exemple indiqué ci-dessus: < / p> merci! p> p>
3 Réponses :
entrée: fonction: p> sortie: p> Channel_Path Source_Path
<chr> <chr>
1 facebook > Email > facebook > Paid Search > f~ facebook > mailtool > m.facebook.com > google > faceboo~
2 Organic Search > Email > pinterest google > mailtool > pinterest
Hey @flo - Malheureusement, cela ne me donne pas la sortie souhaitée sur mon vrai jeu de données. Comme mentionné dans mon commentaire, mon code n'était qu'un échantillon pour la rendre reproductible. Cependant, mon vrai jeu de données représente 60 000 lignes et le code ne correspond pas automatiquement à la position du mot social avec le remplacement correspondant.
Ok j'ai édité mon code pour essayer quelque chose d'un peu différent.
Hé Flo, merci encore d'avoir essayé! Tuton, ce code remplace toutes les valeurs de la colonne "canal_path" avec la valeur que j'ai dans la première ligne de mon ensemble de données. Maintenant, toutes les lignes ont la valeur "Recherche payée".
J'ai prolongé mon exemple par une ligne - peut-être qu'il est alors plus facile de reproduire quand une autre ligne est ajoutée au Dataframe
Mon mauvais, j'ai oublié le commandement d'obœurs () pour diviser la ligne de données par ligne avant d'appliquer la fonction. J'espère que cela fonctionne comme prévu maintenant.
Nous pouvons obtenir les données en format long séparant les colonnes sur ">" code>, remplacer
chanson_path code> valeurs où
canal_path == 'social' code> et coller à nouveau les valeurs.
library(dplyr)
df %>%
mutate(row = row_number()) %>%
tidyr::separate_rows(Channel_Path, Source_Path, sep = " > ") %>%
mutate(Channel_Path = ifelse(Channel_Path == 'Social',
Source_Path, Channel_Path)) %>%
group_by(row) %>%
summarise(across(.fns = ~paste(., collapse = " > "))) %>%
select(-row)
# Channel_Path
#1 facebook > Email > m.facebook.com > Paid Search > facebook+instagram
#2 Organic Search > Email > pinterest
# Source_Path
#1 facebook > mailtool > m.facebook.com > google > facebook+instagram
#2 google > mailtool > pinterest
Hey @ronak, c'est très utile! Une légère adaptation / question: J'ai deux autres colonnes avec les conversions et la valeur de conversion. Après avoir exécuté votre code, ceux-ci sont regroupés avec le ">". En d'autres termes: au lieu d'avoir une valeur de conversion de 600, j'obtiens 600> 600> 600. Y a-t-il un moyen d'éviter que cela se produise pour d'autres colonnes? Merci!
@emil_rore je suppose que vous pouvez modifier la ligne résumer code> ligne sur
résumée (sur (C (Channel_path, source_path), .fns = ~ Coller (., Collapse = ">"))) code> Seuls seulement ces deux colonnes sont modifiées.
Hey Ronak, merci beaucoup! Ouais, vous avez raison - cela ne change que ces deux colonnes, mais ne laisse également que ces deux colonnes dans le "DF". Savez-vous s'il y a des problèmes avec l'utilisation de "conversion = première (conversion)" dans la ligne SUMPARSE pour ajouter les valeurs inchangées à la table d'extrémité?
Oui, vous pouvez utiliser cela dans résumée code>. Sinon, vous pouvez utiliser ces colonnes dans
group_by code> aussi.
Nous allons travailler en ligne à la ligne et pour chaque ligne, nous analysons les éléments de chaque colonne à l'aide de Scan () code>, nous allons utiliser
ifelse () code> à Obtenez un vecteur du bon élément, que nous allons nous effondrer à notre sortie demandée.
library(dplyr, warn.conflicts = FALSE)
df %>%
rowwise() %>%
mutate_at("Channel_Path", ~{
cp <- scan(text = ., what = character(), sep = ">", strip.white = TRUE, quiet = TRUE)
sp <- scan(text = Source_Path, what = character(), sep = ">", strip.white = TRUE, quiet = TRUE)
cp <- ifelse(cp == "Social", sp, cp)
paste(cp, collapse = " > ")
}) %>%
ungroup()
#> # A tibble: 2 x 2
#> Channel_Path Source_Path
#> <chr> <chr>
#> 1 facebook > Email > m.facebook.com > Pai~ facebook > mailtool > m.facebook.com~
#> 2 Organic Search > Email > pinterest google > mailtool > pinterest