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.