在R中拆分未分离的字符串和数字变量

时间:2015-01-12 14:21:35

标签: r split strsplit

我已经将Pdf转换为文本文件,我有一个数据集,其构造如下:

data=c("Paris21London3Tokyo51San Francisco38")

我想获得以下结构:

matrix(c("Paris","London","Tokyo","San Francisco",21,3,51,38),4,2)

有没有人有办法做到这一点?感谢

2 个答案:

答案 0 :(得分:4)

您可以strsplit regexlookahead

尝试lookbehind
v1 <- strsplit(data, '(?<=[^0-9])(?=[0-9])|(?<=[0-9])(?=[^0-9])',
                      perl=TRUE)[[1]]
 indx <- c(TRUE, FALSE)
 data.frame(Col1= v1[indx], Col2=v1[!indx])

更新

包括十进制数字

 data1=c("Paris21.53London3Tokyo51San Francisco38.2")
 v2 <- strsplit(data1, '(?<=[^0-9.])(?=[0-9])|(?<=[0-9])(?=[^0-9.])',
                         perl=TRUE)[[1]]

 indx <- c(TRUE, FALSE)
 data.frame(Col1= v2[indx], Col2=v2[!indx])
 #           Col1  Col2
 #1         Paris 21.53
 #2        London     3
 #3         Tokyo    51
 #4 San Francisco  38.2

答案 1 :(得分:1)

正则表达式是正确的工具,但与其他答案显示不同,strsplit 非常适合这项工作。

更好地使用regular expression matches,并为单词和数字添加两个单独的表达式:

words = '[a-zA-Z ]+'
numbers = '[+-]?\\d+(\\.\\d+)?'
word_matches = gregexpr(words, data)
number_matches = gregexpr(numbers, data)

result = cbind(regmatches(data, word_matches)[[1]],
               regmatches(data, number_matches)[[1]])

这可识别带有可选小数点和可选符号的任何数字。它以科学(指数)表示法识别数字。如有必要,可以简单地添加。