在 R 中拆分未分隔的字符串和数值变量
Splitting unseparated string and numerical variables in R
我已经将 Pdf 转换为文本文件,并且我有一个构造如下的数据集:
data=c("Paris21London3Tokyo51San Francisco38")
我想获得以下结构:
matrix(c("Paris","London","Tokyo","San Francisco",21,3,51,38),4,2)
有没有人有办法做到这一点?谢谢
您可以尝试 strsplit
与 regex
lookahead
和 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
正则表达式在这里是正确的工具,但与其他答案不同的是,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]])
这可以识别任何带有可选小数点和可选符号的数字。它不 识别科学(指数)记数法中的数字。如有必要,可以轻松添加。
我已经将 Pdf 转换为文本文件,并且我有一个构造如下的数据集:
data=c("Paris21London3Tokyo51San Francisco38")
我想获得以下结构:
matrix(c("Paris","London","Tokyo","San Francisco",21,3,51,38),4,2)
有没有人有办法做到这一点?谢谢
您可以尝试 strsplit
与 regex
lookahead
和 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
正则表达式在这里是正确的工具,但与其他答案不同的是,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]])
这可以识别任何带有可选小数点和可选符号的数字。它不 识别科学(指数)记数法中的数字。如有必要,可以轻松添加。