【问题标题】:Factor, levels, and original values因子、水平和原始值
【发布时间】:2012-02-06 16:55:10
【问题描述】:

我想将变量 f 写入现有矩阵 m 的某些元素 (index)。假设f 是一个因素:

f <- factor(c(3,3,0,3,0))
m <- matrix(NA, 10, 1)
index <- c(1,4,5,8,9)

使用

m[index] <- f

没有给出想要的结果,因为它将标签('1'和'2')放入m而不是原始值('0'和'3')。因此,我使用了

m[index] <- as.numeric(levels(f))[f]

相反,效果很好。

但在我的情况下,f 并不总是一个因素,但也可以是数字

f <- c(3.43, 4.29, 5.39, 7.01, 7.15)

我需要检查一下吗

if ( is.factor(f) ) {
    m[index] <- as.numeric(levels(f))[f]
} else {
    m[index] <- f
}

或者是否有一种“通用”方式将f 的“真实”值放入矩阵m,与f 的类型无关?

提前致谢!

PS:背景是ff &lt;- predict(mymodel, Xnew) 的结果,其中model 是由model &lt;- svm(Xtrain, Ytrain) 训练的SVM 模型,可以是分类模型(然后f 是因子)或回归模型(然后f 是数字)。我确实知道模型的类型,但上面的 if 子句对我来说似乎有点不方便。

【问题讨论】:

  • 你能用 data.frame 代替矩阵吗? Data.frames 在数据类型方面更加灵活,矩阵只接受字符或数字。

标签: r r-factor


【解决方案1】:

矩阵的类型不能是“因子”:您必须分别处理因子。 最简单的可能是将它们转换为字符串。

if(is.factor(f)) {
  m[index] <- as.character(f)
} else {
  m[index] <- f
}

【讨论】:

    【解决方案2】:

    为什么不这样做:首先将f(可以是数字或因子)转换为字符,然后再转换为数字:

    m[ index ] <- as.numeric( as.character(f) )
    

    【讨论】:

    • 谢谢,这很好,很简单,似乎适用于所有情况!
    • 如果因子有标签怎么办:f
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多