Какая команда может анализировать буквы и цифры в символьной переменной? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть символьный (строковый) объект в R, который содержит как цифры, так и буквы.При просмотре в среде R он возвращается как:

 [1] " Sample Size =   955"
 [2] " Importance      0.861"
 [3] " Value      0.475 " 

В этом объекте есть еще много строк, но это формат.По сути, каждая строка начинается и заканчивается двойными кавычками «некоторый текст с цифрами внутри», но все эти данные находятся в одном объекте R, который является символом.То, что я хочу иметь, это извлечь только цифры из этого объекта.Итак, в приведенном выше примере я хотел бы получить другой объект, скажем, z, который содержит только 955, 0,861, 0,475.Аналогично, есть ли функция, которая извлекает только текст из каждой строки?Таким образом, я хотел бы получить объект, который содержит размер выборки, значение, значение?

данные

x <- c(" Sample Size =   955", " Importance      0.861", " Value      0.475 ")

Ответы [ 2 ]

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

Вы можете использовать регулярное выражение для решения этой проблемы.Вот возможное решение, основанное на вашем примере:

library(stringr)
vec <- c(" Sample Size =   955", " Importance      0.861", " Value      0.475 ")

str_extract(string = vec, pattern = "[0-9]{1,}(\\.)?[0-9]{0,}")
[1] "955"   "0.861" "0.475"
str_extract(string = vec, pattern = "[a-zA-Z]{1,}(\\s)?[a-zA-Z]{1,}")
[1] "Sample Size" "Importance"  "Value"  

Первое правило будет искать число с 1 или более цифрами, затем возможное . и другое возможное число из 0 или более цифр.Аналогично, второе правило будет искать строку с 1 или более символами, за которой следует возможный пробел (\\s) и другую возможную строку из 1 или более символов.

РЕДАКТИРОВАТЬ:

Что, если у вас есть несколько чисел в одной строке?

В этом случае, я думаю, лучший вариант - разбить каждый элемент, а затем применить функцию кполучить шаблон, который вы хотите.В качестве примера я добавил еще одну цифру к первой записи:

library(stringr)
vec <- c(" Sample Size =   955 95", " Importance      0.861", " Value      0.475 ")
vec_aux <- str_split(string = vec, pattern = " ")

f1 <- function(x) str_extract(string = x, pattern = "[0-9]{1,}(\\.)?[0-9]{0,}")
f2 <- function(x) str_extract(string = x, pattern = "[a-zA-Z]{1,}(\\s)?[a-zA-Z]{1,}")

out1 <- lapply(X = vec_aux, FUN = f1)
lapply(out1, function(x) x[!is.na(x)])

[[1]]
[1] "955" "95" 

[[2]]
[1] "0.861"

[[3]]
[1] "0.475"

out2 <- lapply(X = vec_aux, FUN = f2)
lapply(out2, function(x) x[!is.na(x)])

[[1]]
[1] "Sample" "Size"  

[[2]]
[1] "Importance"

[[3]]
[1] "Value"
0 голосов
/ 06 февраля 2019

обрежьте все пробелы по краям, удалите все знаки равенства и замените последний пробел запятой (или другим символом, если запятая может появиться).Затем прочитайте его, используя read.table.Пакеты не используются.

read.table(text = sub("=", "", sub("(.*) ", "\\1,", trimws(x))), 
  sep = ",", as.is = TRUE, strip.white = TRUE)

, что дает:

           V1      V2
1 Sample Size 955.000
2  Importance   0.861
3       Value   0.475

Если DF является результирующим фреймом данных, тогда DF$V1 и DF$V2 - это два столбца.

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