2
votes

Recodage de valeurs de colonne spécifiques à l'aide de la liste de référence

Ma base de données ressemble à ceci

do.call(dplyr::recode, c(list(data), ref))

Et j'ai une liste de référence qui ressemble à ceci -

ref=list(Male=1,Female=2)

J'aimerais remplacez les valeurs dans la colonne Sexe à l'aide de cette liste de référence, sans ajouter de nouvelle colonne à mon dataframe.

Voici ma tentative

data = data.frame(ID=c(1,2,3,4,5,6,7,8,9,10),
              Gender=c('Male','Female','Female','Female','Male','Female','Male','Male','Female','Female'))

Ce qui me donne l'erreur suivante -

aucune méthode applicable pour 'recoder' appliquée à un objet de classe "data.frame"

Toute contribution serait grandement appréciée

r

0 commentaires

5 Réponses :


2
votes

Une option serait de faire une left_join après stack la liste 'ref' à deux colonnes data.frame

unname(unlist(ref)[as.character(data$Gender)])
#[1] 1 2 2 2 1 2 1 1 2 2

Une approche base R serait

library(dplyr)
left_join(data, stack(ref), by = c('Gender' = 'ind')) %>%
    select(ID, Gender = values)


0 commentaires

2
votes

Dans la base R:

data $ Gender = sapply (data $ Gender, function (x) ref [[x]])


0 commentaires

2
votes

Vous pouvez utiliser le facteur , c'est-à-dire

factor(data$Gender, levels = names(ref), labels = ref)
#[1] 1 2 2 2 1 2 1 1 2 2


0 commentaires

2
votes

Vous pouvez désélectionner ref pour vous donner un vecteur nommé de codes, puis l'indexer avec vos données:

transform(data,Gender=unlist(ref)[as.character(Gender)])
   ID Gender
1   1      1
2   2      2
3   3      2
4   4      2
5   5      1
6   6      2
7   7      1
8   8      1
9   9      2
10 10      2


0 commentaires

1
votes

Étonnamment, celui-là fonctionne également:

data$Gender <- ref[as.character(data$Gender)]

#> data
#    ID Gender
# 1   1      1
# 2   2      2
# 3   3      2
# 4   4      2
# 5   5      1
# 6   6      2
# 7   7      1
# 8   8      1
# 9   9      2
# 10 10      2


0 commentaires