Я ищу более короткое и более красивое решение (возможно, в tidyverse) к следующей проблеме. У меня есть data.frame «данные»:R - извлечь все строки, соответствующие шаблону, и создать реляционную таблицу
id string
1 A 1.001 xxx 123.123
2 B 23,45 lorem ipsum
3 C donald trump
4 D ssss 134, 1,45
То, что я хотел сделать, это извлечь все номера (независимо от того, если разделитель или «» -> в этом случае я предполагаю, что строка «» «134, 1,45» может быть извлечена в два числа: 134 и 1.45) и создать data.frame «выход» ищет похожее на это:
id string
1 A 1.001
2 A 123.123
3 B 23.45
4 C <NA>
5 D 134
6 D 1.45
мне удалось это сделать (код ниже), но решение довольно уродливое для меня также не так эффективно (два for-loops). Может кто-нибудь предложить лучший способ сделать это сделать (предпочтительно с использованием dplyr)
# data
data <- data.frame(id = c("A", "B", "C", "D"),
string = c("1.001 xxx 123.123",
"23,45 lorem ipsum",
"donald trump",
"ssss 134, 1,45"),
stringsAsFactors = FALSE)
# creating empty data.frame
len <- length(unlist(sapply(data$string, function(x) gregexpr("[0-9]+[,|.]?[0-9]*", x))))
output <- data.frame(id = rep(NA, len), string = rep(NA, len))
# main solution
start = 0
for(i in 1:dim(data)[1]){
tmp_len <- length(unlist(gregexpr("[0-9]+[,|.]?[0-9]*", data$string[i])))
for(j in (start+1):(start+tmp_len)){
output[j,1] <- data$id[i]
output[j,2] <- regmatches(data$string[i], gregexpr("[0-9]+[,|.]?[0-9]*", data$string[i]))[[1]][j-start]
}
start = start + tmp_len
}
# further modifications
output$string <- gsub(",", ".", output$string)
output$string <- as.numeric(ifelse(substring(output$string, nchar(output$string), nchar(output$string)) == ".",
substring(output$string, 1, nchar(output$string) - 1),
output$string))
output
Unnest - это функция, которую я искал. Фантастическая почта - спасибо! Один вопрос: в чем причина написания L <- strsplit (trimws (s), "\\ s +") вместо L <- strsplit (trimws (s), "\\ s")? – user2280549
«\\ s» в порядке, если всегда есть один символ пробела - не был уверен. –
Сделали некоторые улучшения для (2) и (3). –