我有非结构化数据,如下所示:
data <- c("24-March-2017 product 1 color 1",
"March-2017-24 product 2 color 2",
"2017-24-March product 3 color 3")
Run Code Online (Sandbox Code Playgroud)
我想计算每行的日期和第一个字符(产品列)之间的空格数.如示例数据所示,日期格式可能会有所不同.此信息将用于将数据置于结构化格式.
在R中执行此操作的最佳方法是什么?我相信gsub在这种情况下可以使用,只是不确定如何应用于只计算每行开头的空格数.
sin*_*eso 11
一种方法是使用regexpr它将返回有关给定正则表达式的第一个匹配的信息.在您的情况下,您正在寻找重复空白的第一个实例.因此,以下内容将告诉您(1)在您的字符串中您将找到第一个空格,以及(2)在属性中您有多少个空格:
regexpr("\\s+", data)
# [1] 14 14 14
# attr(,"match.length")
# [1] 6 14 2
# attr(,"useBytes")
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用attr提取match.length属性:
attr(regexpr("\\s+", data), "match.length")
Run Code Online (Sandbox Code Playgroud)
编辑
正如@xehpuk指出的那样,using \\s+将匹配至少一个空格.如果您的日期列包含可能有问题的空格.相反,你需要使用\\s{2,}.
您可以将该部分分出,然后取出字符数.
nchar(sub("\\S+(\\s+).*", "\\1", data))
# [1] 6 14 2
Run Code Online (Sandbox Code Playgroud)
或者这个有点好玩:
nchar(data) - nchar(sub("\\s+", "", data))
# [1] 6 14 2
Run Code Online (Sandbox Code Playgroud)