我不知道我的问题属于哪个类别。我的文字有如下图案。
1 MERRILL LYNCH 33 2 LEHMAN BROTHERS HLDGS。 82 3 SALOMON 149 4 PAINE WEBBER GROUP 248 5 BEAR STEARNS 328 6 CHARLES SCHWAB 621 7 A.G. EDWARDS& SONS 823
模式是(序列从1,公司名称(由字符或数字组成),数字(最多1000))重复
我想(构建一个函数)将此文本转换为向量;
c("1 MERRILL LYNCH 33", "2 LEHMAN BROTHERS HLDGS. 82", "3 SALOMON 149",
"4 PAINE WEBBER GROUP 248", "5 BEAR STEARNS 328", "6 CHARLES SCHWAB 621",
"7 A.G. EDWARDS & SONS 823")
这可能吗?公司名称或后面的数字没有规律性。在第一个增加序列之后总是有一个空格,一个公司名称之后的空格。如有必要,我可以提供更多信息。
答案 0 :(得分:4)
使用stringr
包
library(stringr)
str_extract_all(txt, "[0-9]+\\D+[0-9]+")
正则表达式读取“任意数量的数字”,然后是“除数字之外的任何数字”,然后是“任意数量的数字”。
给出
[[1]]
[1] "1 MERRILL LYNCH 33" "2 LEHMAN BROTHERS HLDGS. 82" "3 SALOMON 149"
[4] "4 PAINE WEBBER GROUP 248" "5 BEAR STEARNS 328" "6 CHARLES SCHWAB 621"
[7] "7 A.G. EDWARDS & SONS 823"
请注意,结果是一个列表。
答案 1 :(得分:2)
类似于@Remeko Duursma的回答,这里是基础R版本:
regmatches(txt, gregexpr("[0-9]+[^0-9]+[0-9]+", txt))[[1]]
结果:
[1] "1 MERRILL LYNCH 33" "2 LEHMAN BROTHERS HLDGS. 82"
[3] "3 SALOMON 149" "4 PAINE WEBBER GROUP 248"
[5] "5 BEAR STEARNS 328" "6 CHARLES SCHWAB 621"
[7] "7 A.G. EDWARDS & SONS 823"
答案 2 :(得分:1)
或其他选项strsplit
来自base R
strsplit(txt, "(?<=[0-9])\\s+(?=[0-9])", perl = TRUE)[[1]]
#[1] "1 MERRILL LYNCH 33" "2 LEHMAN BROTHERS HLDGS. 82" "3 SALOMON 149"
#[4] "4 PAINE WEBBER GROUP 248" "5 BEAR STEARNS 328" "6 CHARLES SCHWAB 621"
#[7] "7 A.G. EDWARDS & SONS 823"
另一个base R
选项可以是gsub
和scan
scan(text = gsub("(\\d+) (\\d+)", "\\1,\\2", txt), what = "", sep=",", quiet = TRUE)
#[1] "1 MERRILL LYNCH 33" "2 LEHMAN BROTHERS HLDGS. 82" "3 SALOMON 149"
#[4] "4 PAINE WEBBER GROUP 248" "5 BEAR STEARNS 328"
#[6] "6 CHARLES SCHWAB 621" "7 A.G. EDWARDS & SONS 823"