Ecco un modo per utilizzare la switch
dichiarazione:
df <- data.frame(name = c('cow','pig','eagle','pigeon'),
stringsAsFactors = FALSE)
df$type <- sapply(df$name, switch,
cow = 'animal',
pig = 'animal',
eagle = 'bird',
pigeon = 'bird')
> df
name type
1 cow animal
2 pig animal
3 eagle bird
4 pigeon bird
L'unico aspetto negativo di questo è che devi continuare a scrivere il nome della categoria ( animal
, ecc.) Per ogni elemento. È sintatticamente più conveniente poter definire le nostre categorie come di seguito (vedi la domanda molto simile Come aggiungere una colonna in un data frame in R )
myMap <- list(animal = c('cow', 'pig'), bird = c('eagle', 'pigeon'))
e vogliamo in qualche modo "invertire" questa mappatura. Scrivo la mia funzione invMap:
invMap <- function(map) {
items <- as.character( unlist(map) )
nams <- unlist(Map(rep, names(map), sapply(map, length)))
names(nams) <- items
nams
}
e quindi invertire la mappa sopra come segue:
> invMap(myMap)
cow pig eagle pigeon
"animal" "animal" "bird" "bird"
E poi è facile usarlo per aggiungere la type
colonna nel data-frame:
df <- transform(df, type = invMap(myMap)[name])
> df
name type
1 cow animal
2 pig animal
3 eagle bird
4 pigeon bird
dput()
Pubblica un frammento di dati di esempio, utilizzando b) Vuoi una soluzione in base R, dplyr, data.table, tidyverse ...?