使用字符串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)。
也许这是不可能的,我应该继续我的循环?
答案 0 :(得分:0)
您可以使用
df$pos <- as.numeric(sub(".*Id\":(\\d+)}.*", "\\1", df$col))
模式详情
.*
- 任意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