1
votes

Remplacement des entiers dans une colonne de dataframe qui est une liste de vecteurs entiers (pas seulement des entiers simples) par des chaînes de caractères dans R

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 commentaires

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.


3 Réponses :


2
votes

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


1 commentaires

@rilkehayden - rendre le code aussi court que possible tout en restant fonctionnel - voir codegolf.stackexchange.com



1
votes

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!


0 commentaires

1
votes

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.


0 commentaires