Удаление пустых строк из вывода str_extract_all - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь привести в порядок вывод stringr::str_extract_all, чтобы удалить все пустые символьные элементы.

Например, чтобы извлечь числа из следующих строк:

strings <- c("100 is 10 greater than 90", "1 in 10 people have 3 - 4 cats", "earth has 1 moon")

str_extract_all(strings, "\\d*") 

Возвращаетответы, но множество пустых символьных элементов

# [[1]]
# [1] "100" ""    ""    ""    ""    "10"  ""    ""    ""    ""    ""    ""    ""    ""    ""    ""    ""    ""    ""    ""    "90"  ""   
# 
# [[2]]
# [1] "1"  ""   ""   ""   ""   "10" ""   ""   ""   ""   ""   ""   ""   ""   ""   ""   ""   ""   ""   "3"  ""   ""   ""   "4"  ""   ""   ""   ""   ""   ""  
# 
# [[3]]
# [1] ""  ""  ""  ""  ""  ""  ""  ""  ""  ""  "1" ""  ""  ""  ""  ""  "" 

Как я могу удалить "" из этих данных, сохраняя при этом их структуру?то есть

# [[1]]
# [1] "100" "10" "90"   
# 
# [[2]]
# [1] "1"  "10"   "3"   "4"   
# 
# [[3]]
# [1] "1" 

Я пробовал что-то вроде str_extract_all(strings, "\\d*") %>% sapply(., "[!. == ""]"), но не могу его получить

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вы не используете правильное регулярное выражение.Попробуйте

str_extract_all(strings, "\\d+")
#[[1]]
#[1] "100" "10"  "90" 
#
#[[2]]
#[1] "1"  "10" "3"  "4" 
#
#[[3]]
#[1] "1"

Другой подход, использующий только base R

numbers <- gregexpr("\\d+", strings)
regmatches(strings, numbers)

Конечно, это можно записать в одну строку как

regmatches(strings, gregexpr("\\d+", strings))
0 голосов
/ 05 февраля 2019

Вы можете попробовать:

lapply(str_extract_all(strings, "\\d*"), function(x) x[!x %in% ""])

[[1]]
[1] "100" "10"  "90" 

[[2]]
[1] "1"  "10" "3"  "4" 

[[3]]
[1] "1"

Или:

lapply(str_extract_all(strings, "\\d*"), function(x) x[nchar(x) >= 1])

Или:

lapply(str_extract_all(strings, "\\d*"), function(x) x[x != ""])

Или, если вы хотите сделать это напрямую (небольшиммодификация кода от @markus):

regmatches(strings, gregexpr("[0-9]+",  strings))
...