【问题标题】:convert factor to original numeric value将因子转换为原始数值
【发布时间】:2015-12-16 21:45:13
【问题描述】:

我不知道我为什么要为此苦苦挣扎,因为似乎有很多 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

【问题讨论】:

  • 我认为最好的选择是在将其更改为因子类之前创建另一个对象。即v1 &lt;- c(1,1,0,1,0,1); fact &lt;- factor(v1, levels=c(1,0), labels=c('yes', 'no'));unique(v1)[as.numeric(fact)]
  • 一旦你改变了标签,这是不可能的(在最一般的意义上)。如果您知道原始代码是什么以及用什么替换它们,那么您可以在特定情况下返回。例如,如果您不更改标签,您尝试过的解决方案会奏效。
  • 这就是我所缺少的。我认为 R 正在将新信息与旧信息一起存储。我想我希望 R 用数据标签做一些更像 Stata 的事情。
  • 例如c(1,0)[as.integer(fact)] 适用于您的情况,但这需要您知道原始代码及其“顺序”。
  • This 可能是相关问答。

标签: r


【解决方案1】:
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() 的结果不是原始向量,对吧?
  • 是的。它使用 1 和 2。@EricGreen
【解决方案2】:

最简单的解决方案是更改指定调用 factor 的方式,使其可以处理任意数量的数值级别。

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 开始,对吧?
  • 可以从任何东西开始,只要改变你用来调整的常数。这是假设您的数字是连续的。如果不是,那就很棘手了。
猜你喜欢
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2015-06-01
  • 1970-01-01
  • 2013-10-26
  • 2014-05-01
相关资源
最近更新 更多