11

每次我必须重新编码一组变量时,我都会想到 SPSS 重新编码功能。我必须承认这很简单。包中有一个类似的recode功能car,它可以解决问题,但让我们假设我想用factor.

我有data.frame几个变量的值范围从 1 到 7。我想“反转”变量值,因此用 7s 替换 1s,用 6s 替换 2s,用 5s 替换 3s 等。我可以利用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

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

4

4 回答 4

8

您必须为levelsfactor 提供参数(如 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

如您所见,级别按期望顺序扩展。

于 2010-02-26T15:45:07.607 回答
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> 
于 2010-02-26T15:06:32.260 回答
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 
于 2010-02-26T15:45:09.077 回答
1

在这种情况下,既然你有数字,为什么不使用模运算来转换数字呢?

例如

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

如果使用更大的范围,请根据需要修改 6 和 7。

于 2010-02-26T16:18:08.560 回答