>我有如下所示的非结构化数据:
data <- c("24-March-2017 product 1 color 1",
"March-2017-24 product 2 color 2",
"2017-24-March product 3 color 3")
我想计算每行的日期和第一个字符(产品列(之间的空格数。如示例数据所示,日期格式可能会有所不同。此信息将用于将数据转换为结构化格式。
在 R 中执行此操作的最佳方法是什么?我相信gsub
可以在这种情况下使用,只是不确定如何申请仅计算每行开头的空格数。
一种方法是使用regexpr
返回有关给定正则表达式的第一个匹配项的信息。在您的情况下,您正在寻找重复空格的第一个实例。因此,以下内容将告诉您 (1( 在字符串中的哪个位置可以找到第一个空格,以及 (2( 在属性中有多少个空格:
regexpr("\s+", data)
# [1] 14 14 14
# attr(,"match.length")
# [1] 6 14 2
# attr(,"useBytes")
# [1] TRUE
然后,您可以使用attr
提取match.length
属性:
attr(regexpr("\s+", data), "match.length")
编辑
正如@xehpuk所指出的,使用 \s+
将至少匹配一个空格。如果您的日期列包含可能有问题的空格。相反,您需要使用\s{2,}
.
您可以分拆该部分,然后获取字符数。
nchar(sub("\S+(\s+).*", "\1", data))
# [1] 6 14 2
或者这个有点有趣:
nchar(data) - nchar(sub("\s+", "", data))
# [1] 6 14 2
与上述gregexpr
相同的解决方案,但在一行中:
vapply(gregexpr(" +",dat),function(x)attr(x,"match.length")[1],0)
## [1] 6 14 2
我假设日期总是在开始时到来。
这是获取输出的stringi
方法
library(stringi)
m1 <- stri_locate(data, regex = "\s+")
m1[,2] -m1[,1] + 1
#[1] 6 14 2