在我的R代码中,由于lda预测输出,我有以下x的内容。
[1] lamb
Levels: lamb cow chicken
我想抓住" lamb"在第一行而不是第二行。 我有以下reg表达式,但没有用。
if (regmatches(x,regexec(".*?([a-z]+)",x))[[1]][2]=="lamb"){
cat("It is a lamb")
}
相反,我也遇到以下错误: -
Error in regexec(".*?([a-z]+)", x) : invalid 'text' argument
有帮助的人吗? 提前谢谢。
MF
答案 0 :(得分:1)
直接答案:
这是一个变量类型错误。请参阅?predict.lda
以了解原因:与类lda的对象一起使用时,predict()
的返回对象是一个列表。您只需要列表的第一个元素,这是整数类型对象的一个因子。 R中的因子为其级别组件中的每个元素存储一些字符,可以通过levels()
访问(也可以读取?factor
。)。但你想要的是访问你的因子显示的显式值,这可以由as.character()
实现。顺便说一下:正则表达式不会检查第二行。它只是一个因子的标准控制台输出,请参阅?print.factor
。
以下是基于predict.lda()
帮助页面的示例:
tr <- sample(1:50, 25)
train <- rbind(iris3[tr,,1], iris3[tr,,2], iris3[tr,,3])
test <- rbind(iris3[-tr,,1], iris3[-tr,,2], iris3[-tr,,3])
cl <- factor(c(rep("s",25), rep("c",25), rep("v",25)))
z <- lda(train, cl)
x_lda <- predict(z, test)
# x_lda is a list
typeof(x_lda)
# The first element of the list, called "class", is a factor of type integer.
typeof(x_lda$class)
# Now we create a character vector from the factor:
as.character(x_lda$class)
使用明确的字符对象,您的代码适合我:
x <- "lamb"
regmatches(x,regexec(".*?([a-z]+)",x))[[1]][2]=="lamb"
[1] TRUE
因此,您需要将对象强制转换为字符,然后将其用作regexec函数的“text”参数。
实际答案:
有更好的方法可以做到这一点。
如果您知道输出将始终由某些元素组成(特别是,因为您知道lda预测的输入,因此事先知道不同的因子级别),您可以通过{{1}进行检查并且可能==
(继续之前的例子):
any()
如果您不知道它的用途,请参阅levels(cl)
[1] "c" "s" "v"
any(as.character(x_lda$class)=="c")
[1] TRUE
的帮助文件。
最后,如果你只是想打印“它是一只羊羔”,你的输出总是只有一个元素,你可以只需使用?any
:
paste()