使用gregexpr

时间:2017-11-13 15:34:35

标签: r for-loop

几个月后我没有练习就回到了R,我对那里发生的事情有点傻眼

for (year in c('09', '08', '10', '11',
          '12', '13', '14', '15')){

  col <- paste("price_", year, sep="")
  print(col)

  mpt <- gregexpr("P\\.T.*(\\d|,|\\.)+", data[col], perl=TRUE)
  print('done')
  pt_matches = regmatches(data[col], mpt)
  print("matches")}

看起来相当容易,我希望有这个输出:

"price_09"
"done"
"matches"
"price_08"
... # and so on

然而,R似乎没有执行一个完整的循环,我只得到:

"price_09"
"done"

没有别的。我没有收到错误消息,就像分配mpt充当'休息'一样。我会错过一些明显的东西吗?

如果我删除mpt作业,我会打印出“匹配”字样,但它显然会在路上崩溃

1 个答案:

答案 0 :(得分:2)

根据?gregexprtext参数

gregexpr(pattern, text, ignore.case = FALSE, perl = FALSE,
     fixed = FALSE, useBytes = FALSE)

需要vector

  

text - 寻找匹配的字符向量,或者是对象   可以通过as.character强制转换为字符向量。长矢量是   支撑。

此处,data[col]仍为data.frame。要将其转换为vector,请使用[[

使用可重现的例子,

d1 <- data.frame(v1 = c('pine', 'tree', 'chill'))
regmatches(d1['v1'], gregexpr('pi', d1['v1']))
#$v1
#character(0)

regmatches(d1[['v1']], gregexpr('pi', d1[['v1']]))
#[[1]]
#[1] "pi"

#[[2]]
#character(0)

#[[3]]
#character(0)