Перекодируйте / выровняйте факторы data.frame с разными уровнями

Каждый раз, когда мне нужно перекодировать некоторый набор переменных, я имею в виду функцию перекодирования SPSS. Я должен признать, что это довольно просто. В пакете car есть похожая recode функция, и она помогает, но давайте предположим, что я хочу сделать что-то с factor.

У меня есть data.frame с несколькими переменными с диапазоном значений от 1 до 7. Я хочу "перевернуть" значения переменных, заменив единицы на 7, 2 на 6, 3 на 5 и т. Д. Я могу использовать функцию factor:

# create dummy factor
set.seed(100)
x <- as.factor(round(runif(100,1,7)))
y <- factor(x, levels = rev(levels(x)))

И если я бегу:

> levels(x)
[1] "1" "2" "3" "4" "5" "6" "7"
> levels(y)
[1] "7" "6" "5" "4" "3" "2" "1"

Проблема начинается, когда я хочу перекодировать факторы, у которых нет равных уровней. Если какой-то фактор z имеет уровни c("1", "3", "4", "6", "7"), есть ли шанс, что я могу "перевернуть" уровни так, чтобы 1 = 7, 2 = 6, 3 = 5 и т. Д., Используя функцию factor?

Других эффективных функций перекодирования должно хватить!


person aL3xa    schedule 26.02.2010    source источник


Ответы (4)


Вы должны предоставить levels аргумент для фактора (как писал Дирк):

set.seed(2342472)
( x <- round(runif(10,1,7)) )
#  [1] 7 5 5 3 1 2 5 3 3 2
( xf <- as.factor(x) )
# [1] 7 5 5 3 1 2 5 3 3 2
# Levels: 1 2 3 5 7
( yf <- factor(x,levels=7:1) )
# [1] 7 5 5 3 1 2 5 3 3 2
# Levels: 7 6 5 4 3 2 1

вы также можете сделать это на существующем факторе

( yxf <- factor(xf,levels=7:1) )
# [1] 7 5 5 3 1 2 5 3 3 2
#Levels: 7 6 5 4 3 2 1

Как видите, уровни были расширены в порядке желаний.

person Marek    schedule 26.02.2010
comment
Спасибо за это! Кажется, я слишком устал и упускаю очевидное. Решение было таким простым ... Еще раз спасибо! - person aL3xa; 26.02.2010

Да, просто назначьте levels:

R> set.seed(100)
R> x <- as.factor(round(runif(100,1,7)))
R> table(x)
x
 1  2  3  4  5  6  7 
 3 16 20 19 18 17  7 
R> levels(x) <- LETTERS[1:7]
R> table(x)
x
 A  B  C  D  E  F  G 
 3 16 20 19 18 17  7 
R> 
person Dirk Eddelbuettel    schedule 26.02.2010
comment
Похоже, я не совсем лаконично ответил на свой вопрос. Если у меня неполные уровни, например c (2, 4, 5, 6), перевернув их, я получу c (6, 5, 4, 2), и я не хочу этого делать. Я хочу заменить значения / уровни так, чтобы 1 = 7, 2 = 6, 3 = 5 и наоборот. Возможно ли это с помощью функции фактор / уровень, или мне нужно использовать car :: recode () ?? - person aL3xa; 26.02.2010

Если вы пройдете уровни факторов, все готово:

df <- data.frame(x=factor(c(2,4,5,6)))
df$x <- factor(df$x, levels = 7:1)
table(df$x)

7 6 5 4 3 2 1 
0 1 1 1 0 1 0 
person Eduardo Leoni    schedule 26.02.2010

В этом случае, если у вас есть числа, почему бы просто не преобразовать числа с помощью модульной арифметики?

eg

levels(x) <- as.character((6*as.numeric(levels(x)))%%7+1)

При необходимости измените 6 и 7 при использовании больших диапазонов.

person James    schedule 26.02.2010
comment
Оператор модуля (остаток), аналогичный% в C / Java и т. Д., Хотя я считаю, что отрицательные значения обрабатываются по-другому. - person James; 26.02.2010
comment
Интересно ... Я попробую! - person aL3xa; 26.02.2010