在R中使用If(...)功能时的警告消息

时间:2014-04-09 05:07:53

标签: r if-statement warnings conditional-statements

我在R中的if函数遇到了一些问题。

首先我尝试了这个:

test<-matrix(10,3,3)
if(test[2,2]==10) {test[2,2]<-5}

好的,它正在做我想做的事。所以,我会尝试这个:

if(Hylo.Measures[i,3]=="CLc0006x") {Hylo.Measures[i,3]<-"CLc0005x"}

行动!我收到以下消息:

Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "CLc0005x") :
invalid factor level, NA generated

我无法弄清楚这里发生了什么!

我错过了哪一个明显的步骤?

2 个答案:

答案 0 :(得分:2)

第三列是因子变量;你可能想检查你的代码,以确保这是你真正想要的。无论如何,如果您确定它是您想要做的,您可以手动添加级别。以下是在iris

上添加关卡的示例
R>iris$Species[5] <- "hahah"
Warning message:
In `[<-.factor`(`*tmp*`, 5, value = c(1L, 1L, 1L, 1L, NA, 1L, 1L,  :
  invalid factor level, NA generated

R>levels(iris$Species) <- c(levels(iris$Species), "hahah")
R>iris$Species[5] <- "hahah"
R>iris[5,]
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
5            5         3.6          1.4         0.2   hahah

答案 1 :(得分:1)

您面临的问题是真实data.frame中的字符值被存储为因子,这意味着Hylo.Measures[ ,3](至少)的元素仅限于一组离散的级别。 "CLc0005x不存在于任何行中,因此不是该列的有效级别。

尝试执行str(Hylo.Measures),你会看到我的意思。

解决此问题的最简单方法是在不观察因素的情况下构建data.frame。例如,如果您使用的是read.table等,则可以使用参数stringsAsFactors=FALSE,这将确保所有字符串都以characters的形式读入。

我个人在我的.Rprofile中设置options(stringsAsFactors=FALSE)因为它通常会让我感到痛苦,但这不是最佳做法(特别是在团队中工作时),因为它可能导致脚本行为不一致。 / p>