Перекодировать / перезвонить data.frame-факторы с разными уровнями - PullRequest
10 голосов
/ 26 февраля 2010

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

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

# 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?

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

Ответы [ 4 ]

8 голосов
/ 26 февраля 2010

Вы должны предоставить 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

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

3 голосов
/ 26 февраля 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> 
2 голосов
/ 26 февраля 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 
1 голос
/ 26 февраля 2010

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

например

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

Измените 6 и 7 в зависимости от ситуации, если используете более широкий диапазон.

...