Тест для числовых элементов в строке символов

голоса
32

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

x <- c(0.33, .1, 3, 123, 2.3.3, 1.2r)
!grepl([^0-9], x)   #integer test

grepl([^0-9[\\.{0,1}]], x)  # I know it's wrong but don't know what to do

Я ищу для логического вывода, так что я бы ожидать следующие результаты:

[1] TRUE TRUE TRUE TRUE FALSE FALSE
Задан 30/11/2012 в 00:58
источник пользователем
На других языках...                            


5 ответов

голоса
44

Может быть, есть причина, по которой некоторые другие части ваших данных более осложняется тем, что нарушило бы это, но моя первая мысль:

> !is.na(as.numeric(x))
[1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE

Как отмечено ниже Джош О'Брайена это не будет забрать вещи , как 7L, что интерпретатор R будет разобрать , как целое число 7. Если вам необходимо включить их в качестве «правдоподобно Числовой» один маршрут будет , чтобы забрать их с регулярным выражением первый,

x <- c("1.2","1e4","1.2.3","5L")
> x
[1] "1.2"   "1e4"   "1.2.3" "5L"   
> grepl("^[[:digit:]]+L",x)
[1] FALSE FALSE FALSE  TRUE

... а затем убирается «L» от только тех элементов , используя gsubи индексации.

Ответил 30/11/2012 в 01:01
источник пользователем

голоса
4

Я недавно столкнулся с подобной проблемой , когда я пытался написать функцию значений формата передаваемых в виде строки символов из другой функции. Отформатированные значения в конечном счете , будет в конечном итоге в таблице , и я хотел , чтобы создать логику для идентификации NA, символьных строк и символов представления чисел , так что я мог бы применить sprintf()их перед созданием таблицы.

Хотя сложнее читать, я как робастности grepl()подхода. Я думаю , что это становится все примеры воспитывающихся в комментариях.

x <- c("0",37,"42","-5","-2.3","1.36e4","4L","La","ti","da",NA)

y <- grepl("[-]?[0-9]+[.]?[0-9]*|[-]?[0-9]+[L]?|[-]?[0-9]+[.]?[0-9]*[eE][0-9]+",x)

Это будет вычисляться (отформатирован, чтобы помочь с визуализацией):

x
[1] "0"  "37"   "42"  "-5"   "-2.3"   "1.36e4" "4L" "La"     "ti"     "da"     NA 

y
[1] TRUE  TRUE   TRUE  TRUE   TRUE     TRUE    TRUE FALSE   FALSE    FALSE    FALSE

Регулярное выражение имеет значение ИСТИНА для:

  • положительные или отрицательные числа, не более одного десятичного знака ИЛИ
  • положительные или отрицательные целые числа (например, 4L) ИЛИ
  • положительные или отрицательные числа в экспоненциальном

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

Ответил 16/01/2014 в 04:14
источник пользователем

голоса
0

Вдохновленные ответы здесь, моя функция урезает ведущие и завершающие пробелы, может Генделя na.strings, и, возможно, относится к NA как числовой как. Регулярное выражение было усилено, а также. Смотрите информацию в справке. Все, что ты хочешь!

check if a str obj is actually numeric
@description check if a str obj is actually numeric
#' @param x a str vector, or a factor of str vector, or numeric vector. x will be coerced and trimws.
#' @param na.strings case sensitive strings that will be treated to NA.
#' @param naAsTrue whether NA (including actual NA and na.strings) will be treated as numeric like
#' @return a logical vector (vectorized).
#' @export
#' @note Using regular expression
#' \cr TRUE for any actual numeric c(3,4,5,9.9) or c("-3","+4.4",   "-42","4L","9L",   "1.36e4","1.36E4",    NA, "NA", "","NaN", NaN): 
#' \cr positive or negative numbers with no more than one decimal c("-3","+4.4") OR
#' \cr positive or negative integers (e.g., c("-42","4L","39L")) OR
#' \cr positive or negative numbers in scientific notation c("1.36e4","1.36E4")
#' \cr NA, or na.strings
is.numeric.like <- function(x,naAsTrue=TRUE,na.strings=c('','.','NA','na','N/A','n/a','NaN','nan')){
    x = trimws(x,'both')
    x[x %in% na.strings] = NA
    # https://stackoverflow.com/a/21154566/2292993
    result = grepl("^[\\-\\+]?[0-9]+[\\.]?[0-9]*$|^[\\-\\+]?[0-9]+[L]?$|^[\\-\\+]?[0-9]+[\\.]?[0-9]*[eE][0-9]+$",x,perl=TRUE)
    if (naAsTrue) result = result | is.na(x)
    return((result))
}
Ответил 12/11/2018 в 23:30
источник пользователем

голоса
0

Вы также можете использовать:

readr::parse_number("I am 4526dfkljvdljkvvkv")

Для того, чтобы получить 4526.

Ответил 23/05/2019 в 11:32
источник пользователем

голоса
0

Избегайте Переизобретая колесо check.numeric()из пакета varhandle .

Функция принимает следующие аргументы:

v Вектор символов или фактор вектор. (Обязательный)

na.rm логично. Если функция игнорировать NA? Значение по умолчанию FLASE поскольку NA может быть преобразован в числовой. (Необязательный)

only.integer логично. Только проверять целые и не принимают с плавающей точкой. Значение по умолчанию FALSE. (Необязательный)

Исключение вектора символов , содержащие строки , которые должны рассматриваться как действительные для преобразования в числовой. (Необязательный)

ignore.whitespace логично. Игнорирует и хвостовых пробельные символы , прежде чем оценки , если вектор может быть преобразован в числовой. Значение по умолчанию равно TRUE. (Необязательный)

Ответил 01/08/2019 в 04:01
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more