Каждый раз, когда я должен повторно кодировать некоторый набор переменных, я имею функцию перекода SPSS в виду. Я должен признать, что это довольно просто. Существует подобное recode
функция в car
пакет, и это добивается цели, но давайте предположим, что я хочу добиться цели с factor
.
Я имею data.frame
с несколькими переменными с диапазоном значений от 1 до 7. Я хочу "инвертировать" значения переменных, следовательно заменяя 1 с 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
функция?
Другие эффективные функции перекода должны быть достаточными!
Вы должны предоставить аргумент уровней
для фактора (как писал Дирк):
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
Как вы видите, уровни были расширены в порядке желаний.
Если вы пройдете уровни факторов, все готово:
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
Да, просто назначьте уровней
:
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>
В данном случае, поскольку у вас есть числа, почему бы просто не преобразовать их с помощью модульной арифметики?
например
levels(x) <- as.character((6*as.numeric(levels(x)))%%7+1)
При использовании больших диапазонов измените 6 и 7 соответствующим образом.