J'ai un dataframe avec une colonne qui est en fait une liste de vecteurs entiers (pas seulement des entiers simples).
# make dataframe of desired result desired_result <- data.frame(first_names = c("Megan", "Abby", "Alyssa", "Alex", "Heather")) desired_result$player_indices <- list(c("Rapinoe"), c("Wambach", "Dahlkemper"), c("Naeher"), c("Morgan"), c("Mitts", "O'Reilly"))
Je veux remplacer les entiers par des chaînes de caractères selon un second dataframe de concordance .
# make concordance dataframe example_concord <- data.frame(last_names = c("Rapinoe", "Wambach", "Naeher", "Morgan", "Dahlkemper", "Mitts", "O'Reilly"), player_ids = as.integer(c(1,2,3,4,5,6,7)))
Le résultat souhaité ressemblerait à ceci:
# make example dataframe starting_dataframe <- data.frame(first_names = c("Megan", "Abby", "Alyssa", "Alex", "Heather")) starting_dataframe$player_indices <- list(as.integer(1), as.integer(c(2, 5)), as.integer(3), as.integer(4), as.integer(c(6, 7)))
Je ne peux pas pour la vie de moi comprendre comment le faire et n'a pas réussi à trouver un cas similaire ici sur stackoverflow. Comment fait-on ça? Une solution spécifique à dplyr
ne me dérangerait pas en particulier.
3 Réponses :
Je suggère de créer une sorte de "dictionnaire de recherche" et de lapply
sur chacun des identifiants:
Map(`[`, list(example_concord_idx), starting_dataframe$player_indices)
(Code golf?)
XXX
@rilkehayden - rendre le code aussi court que possible tout en restant fonctionnel - voir codegolf.stackexchange.com
Pour les amateurs de tidyverse
, j'ai adapté la seconde moitié de la réponse acceptée par r2evans pour utiliser map ()
et %>%
:
require(tidyverse) starting_dataframe <- starting_dataframe %>% mutate( result = map(.x = player_indices, .f = function(a) example_concord_idx[a]) )
Je ne gagnerai certainement pas le code golf, cependant!
Une autre façon est de désélectionner
la colonne de liste, et de la remettre en vente
après avoir modifié son contenu:
## initial data.frame w/ list-column df1 <- data.frame(first_names = c("Megan", "Abby", "Alyssa", "Alex", "Heather"), stringsAsFactors = FALSE) df1$player_indices <- list(1, c(2,5), 3, 4, c(6,7)) ## lookup data.frame df2 <- data.frame(last_names = c("Rapinoe", "Wambach", "Naeher", "Morgan", "Dahlkemper", "Mitts", "O'Reilly"), stringsAsFactors = FALSE)
Données
df1$player_indices <- relist(df2$last_names[unlist(df1$player_indices)], df1$player_indices) df1 #> first_names player_indices #> 1 Megan Rapinoe #> 2 Abby Wambach, Dahlkemper #> 3 Alyssa Naeher #> 4 Alex Morgan #> 5 Heather Mitts, O'Reilly
NB: J'ai défini stringsAsFactors = FALSE
pour créer des colonnes de caractères dans les data.frames, mais cela fonctionne aussi bien avec colonnes de facteurs à la place.
P.S. Brownie désigne quiconque obtient les références. :RÉ
Des joueuses de football professionnelles américaines?
Oui! Pour célébrer leur récente victoire en Coupe du monde.