Disons que j'ai le dataframe suivant (le vrai est 10 colonnes labelx):
column_list <- c("label1","label2")
new_df <- df
for(i in 1:2) {
new_df <- new_df %>%
mutate(parse(text=column_list[i-1]) = replace(parse(text=column_list[i-1]),
(parse(text=column_list[i-1]) %in% food),
"food"))
}
Et je voudrais remplacer tous les éléments dans les colonnes d'étiquette par un mot qui le catégorise.
/ p>
food <- c("apple","banana","pie","fruit")
clothing <- c("shoe","hat","beanie")
entertainment <- c("radio","ipod","mp3 player","phone")
forest <- c("tree","doug fir","redwood","forest")
J'ai essayé quelque chose comme ce qui suit:
id <- c(1,2,3,4,5,6,7,8)
label1 <- c("apple","shoe","banana","hat","dog","radio","tree","pie")
label2 <- c("apple","sneaker","fruit","beanie","pet","ipod","doug fir","pie")
df <- data.frame(id,label1,label2)
Je n'ai pas à le faire de cette façon, plus facilement c'est bien aussi. Tidyverse a préféré. Comment remplacer plusieurs valeurs parmi plusieurs colonnes dans R dataframe?
3 Réponses :
Une possibilité pourrait être d'utiliser mutate_at () puis un ifelse() :
df %>%
mutate_at(vars(contains("label")),
funs(ifelse(. %in% food, "food",
ifelse(. %in% clothing, "clothing",
ifelse(. %in% entertainment, "entertainment",
ifelse(. %in% forest, "forest", NA_character_))))))
id label1 label2
1 1 food food
2 2 clothing <NA>
3 3 food food
4 4 clothing clothing
5 5 <NA> <NA>
6 6 entertainment entertainment
7 7 forest forest
8 8 food food
Avec mutate_at ( ) , il sélectionne les variables qui ont "label" dans leur nom puis applique simplement un ifelse () imbriqué en fonction des conditions.
Voici une approche utilisant la base R. L'idée est de créer un vecteur nommé où les noms sont des choses individuelles ( apple , shoe , etc.) et les valeurs sont les catégories ( nourriture , vêtements , etc.). Il s'agit ensuite d'extraire les catégories directement à l'aide des noms.
obj = c("food", "clothing", "entertainment", "forest")
mylist = mget(obj)
mylist = lapply(obj, function(x){
temp = mylist[[x]]
setNames(rep(x, length(temp)), temp)
})
mylist = unlist(mylist)
df[-1] = lapply(df[-1], function(x) as.vector(mylist[as.character(x)]))
df
# id label1 label2
#1 1 food food
#2 2 clothing <NA>
#3 3 food food
#4 4 clothing clothing
#5 5 <NA> <NA>
#6 6 entertainment entertainment
#7 7 forest forest
#8 8 food food
Si vous avez toutes les étiquettes dans une seule liste, vous pouvez utiliser dplyr::recode.
library("dplyr")
labels <- list()
for (x in food) { labels[x] = "food" }
for (x in clothing) { labels[x] = "clothing" }
for (x in entertainment) { labels[x] = "entertainment" }
for (x in forest) { labels[x] = "forest" }
df %>%
mutate_at(vars(label1, label2), recode, !!!labels)