我有非结构化数据,如下所示:
x <- c("24-March-2017 text1 874874455221112 Text text text10",
"25-March-2017 text2 54654656TEXT Text text 11",
"24-March-2017 text3 874874455221112 Text text text 12")
我想在第3列之前计算包括空格在内的字符数。例如,在第一行我想在数字874874455221112之前计算。
答案 0 :(得分:3)
gregexpr
是基本R regex函数,它返回有关字符串中多个匹配位置的信息。要提取它们,您需要使用regmatches
,但由于gregexpr
返回每个匹配的第一个字符的索引,您只需搜索非空格字符组\\S+
,选择第三个索引,并减去一个以获得前面的字符数:
sapply(gregexpr('\\S+', x), `[`, 3) - 1
#> [1] 30 34 31
答案 1 :(得分:2)
使用stringr
库:
library(stringr)
str_length(str_extract(x,"^(\\S+\\s+){2}"))
答案 2 :(得分:1)
以下是一些在R的基础上都使用regexpr
的单行。没有使用包。
1)通常,您可以做出的假设越多,答案就越短。
在这里我们得到一个非常紧凑的答案,假设你在你的意思问题中写文字。话。在这种情况下,第三个字段是第一个字段,它都以数字开头并以空格开头,因此要查找空格字符(“\\s"
”)后跟数字("\\d"
)。
regexpr("\\s\\d", x)
,并提供:
[1] 30 34 31
attr(,"match.length")
[1] 2 2 2
attr(,"useBytes")
[1] TRUE
2)如果单词假设不是这样,那么第二个字段可以以数字开头,那么我们可以通过将第二个字段的第一个字符更改为一个非数字,x
说,然后执行上述操作。在下面的代码中,"\\S"
匹配任何非空白字符。这给出了与(1)相同的答案,除了它也适用于第二个字段以数字开头的情况。
regexpr("\\s\\d", sub("\\s\\S", " x", x))
3)另一种方法是匹配前两个字段和超出它们的空间。 regexpr
将在"match.length"
属性中返回所需的字符长度。
attr(regexpr("^(\\S+\\s+){2}", x), "match.length")
## [1] 30 34 31
注意:如果问题是阅读4个字段的部分答案,那么可以通过在字段之间插入逗号或其他特殊字符直接完成,然后使用{{1}读取结果}。我假设第3个字段都是数字,所以TEXT应该在第4个字段中,但是如果它应该在第3个字段中,那么在read.table
中用"\\d"
替换"\\S"
pat
,并提供:
pat <- "^(\\S+)\\s+(\\S+)\\s+(\\d+)\\s*(.*)"
read.table(text = sub(pat, "\\1,\\2,\\3,\\4", x), sep = ",", colClasses = "character")