R:无法将因子转换为数字

时间:2014-09-15 11:42:22

标签: r

我有这个因子向量:

yoyo <- structure(c(1L, 3L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, + 3L, 5L, 1L, 2L, 3L, 3L, 5L), .Label = c("[0,1)", "[1,15)", "[15,30)", + "[30,40)", "[40,60]"), class = "factor")

当我尝试通过

将此因子向量转换为数字向量时
as.numeric(levels(yoyo)[yoyo])
 [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Warning message:
NAs introduced by coercion 

as.numeric(levels(yoyo))[yoyo]
 [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Warning message:
NAs introduced by coercion 

我只得到NAs。我怎么解决这个问题 ?

更新 问题是如何将因子(从R中的cut函数获得)转换为数值?这不是一件非常容易或直截了当的事情。所以,我不明白为什么这个问题被低估了。

as.numeric(yoyo)不正确,正如?factor中所述。

4 个答案:

答案 0 :(得分:2)

要获得关卡的下限和上限,可以使用

sapply(strsplit(as.character(yoyo), split=','), 
       function(x) as.numeric(gsub(x, pattern="[^0-9]+", replacement="")))

答案 1 :(得分:1)

要获得下限和上限,另一种方法是:

library(stringr)
read.table(text=str_trim(gsub("[^0-9]+", " ", yoyo)),sep="")

答案 2 :(得分:0)

如果您只想将矢量的类别从factor更改为numeric(我认为您要问的话),简单的as.numericc就足够了。如果你想要一个数值,它以某种方式表示相关的区间(你的因子向量很可能是cut函数的输出),你应该指定你想要的值(因为你的级别指定了一个范围,而不是单一的价值)。我提出了一种显示每个区间平均值的方法。例如,[0,1)值将替换为0.5。

    require(stringr)
    colMeans(matrix(as.numeric(simplify2array(str_extract_all(levels(yoyo),"[0-9]+"))),nrow=2))[yoyo]

答案 3 :(得分:0)

如果你所追求的是你用来创建c(1L, 3L,....)的第一个yoyo序列, 然后(编辑)as.numeric(yoyo)就是所需要的。

编辑 - 我在下面这么做。不要做我做的事。

newstring <- rep(NA,length(yoyo))
(for j in 1:(length(levels(yoyo))) {
   indx <- which((yoyo)==levels(yoyo)[j])
   newstring[c(indx)] <- j
}