R:正则表达式仅匹配第一行中的模式

时间:2014-10-24 15:23:51

标签: regex r

在我的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

1 个答案:

答案 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”参数。

实际答案:

有更好的方法可以做到这一点。

  1. 您将许多功能嵌套并链接在一行中。这几乎没有可读性,使调试变得困难。
  2. 如果您知道输出将始终由某些元素组成(特别是,因为您知道lda预测的输入,因此事先知道不同的因子级别),您可以通过{{1}进行检查并且可能==(继续之前的例子):

    any()

    如果您不知道它的用途,请参阅levels(cl) [1] "c" "s" "v" any(as.character(x_lda$class)=="c") [1] TRUE 的帮助文件。

  3. 最后,如果你只是想打印“它是一只羊羔”,你的输出总是只有一个元素,你可以只需使用?any

    paste()