如何在没有循环的情况下从数据框文本列中提取子字符串

时间:2018-02-09 14:27:03

标签: r regex

使用字符串I' m的数据框尝试使用子字符串的位置构建新列。

当regexpr处理整个列时,我通过循环构建它。有没有更聪明的方法来构建没有循环的列?

abc <- "{\"left\":\"foo\",\"right\":\"no\"},\"answer\":\"left\",\"Id\":258}\""
abb <- "{\"left\":\"foo\",\"up\":\"no\"},\"answer\":\"updownupdwon\",\"Id\":258}\""
df <- data.frame(col=c(abb,abc))
df$pos <- regexpr( "Id\\\":(.*?)}",df$col)

我的最终目标是在不编写循环的情况下获取数值(此处为258)。

也许这是不可能的,我应该继续我的循环?

1 个答案:

答案 0 :(得分:0)

您可以使用

df$pos <- as.numeric(sub(".*Id\":(\\d+)}.*", "\\1", df$col))

请参阅regex online demo

模式详情

  • .* - 任意0个字符,尽可能多
  • Id\": - Id":子字符串
  • (\d+) - 第1组(替换模式中称为\1):一个或多个数字
  • } - }字符
  • .* - 任意0个字符,尽可能多(字符串末尾)

请参阅R online demo

abc <- "{\"left\":\"foo\",\"right\":\"no\"},\"answer\":\"left\",\"Id\":258}\""
abb <- "{\"left\":\"foo\",\"up\":\"no\"},\"answer\":\"updownupdwon\",\"Id\":258}\""
df <- data.frame(col=c(abb,abc))
df$pos <- as.numeric(sub(".*Id\":(\\d+)}.*", "\\1", df$col))
df

结果:

                                                          col pos
1 {"left":"foo","up":"no"},"answer":"updownupdwon","Id":258}" 258
2      {"left":"foo","right":"no"},"answer":"left","Id":258}" 258