Transformação de dados em R: melhor para operar com valores de linha ou níveis de fator?
Digamos que você note que alguns dos valores em seu grande vetor de fatores são semelhantes. Qual é a melhor estratégia para consolidar esses valores? Eu usei duas estratégias em minhas análises, as quais parecem comparáveis em desempenho. 1, colocando a lógica de consolidação em uma função e usandosapply
e 2, alterando os próprios níveis dos fatores. Abaixo, eu produzi um exemplo de cada um.
Exemplo 1, colocando a lógica de consolidação em uma função e usandosapply
:
favorite.color <- c('yellow', 'banana', 'canary yellow', 'aqua', 'blue')
messy.vector.of.favorite.colors <- as.factor(sample(favorite.color, 10000, replace=TRUE))
consolidate.colors <- function(color) {
if(color == 'banana') {
return('yellow')
}
if(color == 'canary yellow') {
return('yellow')
}
if(color == 'aqua') {
return('blue')
}
else {
return(color)
}
}
clean.colors <- as.factor(sapply(as.character(messy.vector.of.favorite.colors), consolidate.colors, USE.NAMES=FALSE))
# Gives factor vector with two levels: blue, yellow
Exemplo 2, alterando diretamente os próprios rótulos de fator:
favorite.color <- c('yellow', 'banana', 'canary yellow', 'aqua', 'blue')
messy.vector.of.favorite.colors <- as.factor(sample(favorite.color, 10000, replace=TRUE))
working.vector <- messy.vector.of.favorite.colors
levels(working.vector)[levels(working.vector) == 'banana'] <- 'yellow'
levels(working.vector)[levels(working.vector) == 'canary yellow'] <- 'yellow'
levels(working.vector)[levels(working.vector) == 'aqua'] <- 'blue'
clean.colors <- working.vector
# Gives factor vector with two levels: blue, yellow