Как подсчитать количество пробелов сразу после даты?
У меня есть неструктурированные данные, которые выглядят так:
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
можно использовать в этом случае, просто не уверен, как применять для подсчета только числа пробелов в начале каждой строки.
Ответы
Ответ 1
Одним из подходов было бы использовать 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,}
.
Ответ 2
Вы можете вывести этот раздел, а затем взять количество символов.
nchar(sub("\\S+(\\s+).*", "\\1", data))
# [1] 6 14 2
Или это одно удовольствие:
nchar(data) - nchar(sub("\\s+", "", data))
# [1] 6 14 2
Ответ 3
То же решение с использованием gregexpr
как указано выше, но в одной строке:
vapply(gregexpr(" +",dat),function(x)attr(x,"match.length")[1],0)
## [1] 6 14 2
Я предполагаю, что дата всегда наступает в начале.
Ответ 4
Вот подход stringi
для получения вывода
library(stringi)
m1 <- stri_locate(data, regex = "\\s+")
m1[,2] -m1[,1] + 1
#[1] 6 14 2