重新编码/重新定位具有不同级别的数据框架因子

时间:2010-02-26 15:00:55

标签: r levels

每次我必须重新编码一组变量时,我都会考虑SPSS重新编码功能。我必须承认这很简单。在recode包中有一个类似的car函数,它可以解决这个问题,但我们假设我希望用factor来完成工作。

我有data.frame有几个变量值,范围从1到7.我想“反转”变量值,因此用7s替换1s,用6s替换2s,用5s替换3s等。我可以使用{{ 1}}功能:

factor

如果我跑:

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

当我想重新编码没有相同级别的因素时,问题就开始了。如果某个因子z具有等级> levels(x) [1] "1" "2" "3" "4" "5" "6" "7" > levels(y) [1] "7" "6" "5" "4" "3" "2" "1" ,那么我是否有可能通过利用c("1", "3", "4", "6", "7")函数来“反转”等级1 = 7,2 = 6,3 = 5等?

其他有效的重新编码功能应该足够了!

4 个答案:

答案 0 :(得分:7)

你必须向因子提供levels参数(如Dirk所写):

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

如你所见,等级按需求顺序延长。

答案 1 :(得分:3)

是的,只需分配到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 :(得分:2)

如果你完成了因子水平,你可以去:

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 

答案 3 :(得分:1)

在这种情况下,由于您有数字,为什么不使用模运算转换数字?

例如

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

如果使用更大的范围,则适当修改6和7。