Извлечение числовых значений из строк и разделение их в соответствии с исходным порядком - PullRequest
1 голос
/ 26 сентября 2019

Я пытаюсь извлечь все числовые значения из строкового столбца в R, который содержит числовые и не числовые значения.Моя цель - сохранить исходный порядок, заменив все накопления нечисловых значений запятыми.

Данные моего примера:

name <- c("./Stimuli\49stim_9_with_14_vs_23_mix2.png", "./Stimuli\54stim_14_with_15_vs_21_mix2.png", "./Stimuli\75stim_15_with_18_vs_26_incongruent.png")

Мой ожидаемый результат:

expectedpoutcome <- c("49, 9, 14, 23, 2", "54, 14, 15, 21, 2", "75, 15, 18, 26")

Ближайшее, что я мог получить:

library(stringr)

myoutcome <- name %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric

Проблема сэтот список означает, что информация о том, из какой исходной строки были числа, теряется.

Ответы [ 3 ]

3 голосов
/ 26 сентября 2019

Ваше регулярное выражение верно.Скорее проблема заключается в коде, который следует за ним: вы выравниваете список (и, таким образом, теряете соответствие между числами и исходной строкой), а затем конвертируете выходные данные в числа, даже если указали, что хотитеполучить строку .

Итак, начните с удаления шагов %>% unlist %>% as.numeric.

Далее, есть хитрый трюк для объединения списка строк в одну запятуюстрока с разделителями: toString.Поэтому примените это к списку результатов:

name %>% stringr::str_match_all("[0-9]+") %>% sapply(toString)

И вот оно у нас.

Кроме того, вы можете упростить регулярное выражение: \d идентично [0-9];давая нам:

name %>% stringr::str_match_all("\\d+") %>% sapply(toString)

И, наконец, ваш «ожидаемый результат» совершенно неверен, потому что вы неверно истолковываете значение escape-последовательности обратной косой черты в строке. Прочитайте документацию по escape-последовательностям строк .

В качестве альтернативы, вместо сопоставления всех цифр, вы можете сделать наоборот: сопоставить все, что не цифру, и заменить такие прогонына ', '.Однако затем вам нужно будет удалить начальные и конечные запятые:

trimws(gsub('\\D+', ', ', name), whitespace = ', ')
1 голос
/ 26 сентября 2019

Используя базу R, мы можем извлечь все числовые значения, используя gregexpr и regmatches, и изменить их на строку через запятую, используя toString.

sapply(regmatches(name, gregexpr("[0-9]+", name)), toString)
#[1] "49, 9, 14, 23, 2" "14, 15, 21, 2"    "75, 15, 18, 26"
1 голос
/ 26 сентября 2019

Тидиверс является следующим решением:

name %>% str_extract_all("\\d+") %>% map_chr(paste, collapse = ", ")

Это не приводит к выводу, который вы показали, причина в том, что вы предоставляете экранированные символы, которые в итоге не являются числами.
R выигралНе знаю, что было предоставлено как есть, а что было получено через escape-последовательность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...