我有这个因子向量:
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
中所述。
答案 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.numeric
或c
就足够了。如果你想要一个数值,它以某种方式表示相关的区间(你的因子向量很可能是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
}