我在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
我无法弄清楚这里发生了什么!
我错过了哪一个明显的步骤?
答案 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>