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

Каждый раз, когда я должен повторно кодировать некоторый набор переменных, я имею функцию перекода 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 функция?

Другие эффективные функции перекода должны быть достаточными!

10
задан sjakobi 7 December 2013 в 10:15
поделиться

4 ответа

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

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

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

8
ответ дан 3 December 2019 в 23:12
поделиться

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

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 
2
ответ дан 3 December 2019 в 23:12
поделиться

Да, просто назначьте уровней :

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> 
3
ответ дан 3 December 2019 в 23:12
поделиться

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

например

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

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

1
ответ дан 3 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: