将因子转换为原始数值

6

我不知道为什么会在这方面有困难,因为似乎有许多SO(注:stackoverflow的缩写)的答案都涉及到了这个问题。但是我还是来了。

我将由1和0组成的向量转换为因子,并将值标记为“是”和“否”。

fact <- factor(c(1,1,0,1,0,1),
               levels=c(1,0),
               labels=c("yes", "no"))
#[1] yes yes no  yes no  yes
#Levels: yes no

关于将转换因子回归数值的问题,建议使用as.numeric(as.character(x))as.numeric(levels(x)[x])

as.numeric(as.character(fact))
#[1] NA NA NA NA NA NA

as.numeric(levels(fact))[fact]
#[1] NA NA NA NA NA NA

1
我认为最好的选择是在将其更改为因子类之前创建另一个对象。即 v1 <- c(1,1,0,1,0,1); fact <- factor(v1, levels=c(1,0), labels=c('yes', 'no'));unique(v1)[as.numeric(fact)] - akrun
4
如果你改变标签,一般情况下就不能做到这一点了。但在特定情况下,如果你知道原始代码和替换后的代码,还是有办法进行回溯的。例如,如果你没有改变标签,那么你尝试的解决方案本来是可行的。 - joran
1
这就是我所缺失的。我以为 R 会将新信息与旧信息一起存储。我认为我更希望 R 能够像 Stata 一样使用数据标签。 - Eric Green
1
在你的情况下,c(1,0)[as.integer(fact)] 可以工作,但这需要你知道原始代码及其“顺序”。 - joran
NBATrends提供了一个可行的想法,所以我接受了这个答案,但@joran澄清了我的困惑。感谢你们的想法。 - Eric Green
显示剩余3条评论
2个回答

2
fact <- factor(c(1,1,0,1,0,1),
               levels=c(1,0),
               labels=c("yes", "no"))
fact
# [1] yes yes no  yes no  yes
# Levels: yes no
levels(fact)
# [1] "yes" "no" 

现在,fact的级别是一个字符向量。使用as.numeric(as.character(fact))并不能完成任务。

c(1, 0)[fact]
# [1] 1 1 0 1 0 1

更新:

unclass(fact)
# [1] 1 1 2 1 2 1
# attr(,"levels")
# [1] "yes" "no" 
mode(fact)
# [1] "numeric"

在您的更新中,unclass() 的结果不是原始向量,对吗? - Eric Green
是的。它使用1和2。@EricGreen - Ven Yao

0
最简单的解决方案是更改指定调用因子的方式,使其可以处理任意数量的数字级别。
fact <- factor(c(1,1,0,1,0,1, 2),
               levels=c(0,1, 2),
               labels=c("no", "yes", "maybe"))
as.numeric(fact) - 1

你的编码始终需要以0开始,这是非常重要的,对吧? - Eric Green
可以从任何数字开始,只需更改您用于调整的常量即可。这是假设您的数字是连续的。如果它们不是连续的,那就会变得棘手。 - Raad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接