2015-12-16 53 views
5

我不知道为什么我正在为此付出努力,因为似乎有很多SO回答解决了这个问题。但我在这里。将转换因子转换为原始数值

我将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);事实< - factor(v1,levels = c(1,0),labels = c('yes','no')); unique(v1)[as.numeric(fact)]' – akrun

+4

更改标签后,这是不可能的(从最一般意义上讲)。如果您知道原始代码是什么以及您替换了哪些代码,您可以在特定情况下返回。例如,如果您没有更改标签,那么您尝试使用的解决方案就能奏效。 – joran

+0

这就是我所缺少的。我认为R与旧的存储新的信息。我想我想让R做更多像Stata一样的数据标签。 –

回答

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

重要的一点是你的编码总是需要从0开始的,对吧? –

+0

可以从任何东西开始,只需更改用于调整的常量。这是假设你的数字是连续的。如果他们不是这样就会变得棘手。 – Raad

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" 
+0

在你的更新中,'unclass()'的结果不是原始向量,对不对? –

+0

是的。它使用1和2. @EricGreen –