Как проверить, содержит ли значение переменной числа против значения в R - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть следующий фрейм данных R. столбец "state" является столбцом factor . У меня есть 2 вопроса:

1- Я хочу создать флаг относительно того, является ли каждая строка (значение состояния) числом или персонаж. 1, если символ, и 0, если число

ID   state
 1   123fg^>
 2   fhgfh@
 3   125@!
 4   125

и я хочу, чтобы вывод выглядел следующим образом

ID   state   Flag
 1   123fg^>    1
 2   fhgfh@     1
 3   125@!      1
 4   125        0

2- Далее я хочу создать флаг 1 или 0, если ячейка содержит числа. поэтому для того же примера я хочу иметь следующий вывод

ID   state   Flag
 1   123fg^>    1
 2   fhgfh@     0
 3   125@!      1
 4   125        1

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Немного более надежный числовой метод обнаружения (основанный на ответе Акруна)

as.integer(grepl("[0-9]",df$state))
#> [1] 1 0 1

Поскольку вы запрашиваете строку, содержащую числа, это более простое решение, а также обрабатывает случай чистой пунктуации.

as.integer(grepl("[0-9]","!?"))
#> [1] 0
as.integer(!grepl("^[A-Za-z]+$", "?!"))
#> [1] 1
0 голосов
/ 26 апреля 2018

Опция, использующая gsub, может быть такой:

as.numeric(gsub("[0-9]|\\.","",df$state) != "")
[1] 1 1 1 0

|\\. => Это позволит определять четные числа с дробью (т. Е. 125,8)

0 голосов
/ 26 апреля 2018

Мы можем использовать grep для обоих случаев, чтобы сопоставить одно или несколько чисел ([0-9]+) от начала (^) до конца ($)

as.integer(!grepl("^[0-9]+$", df$state))
#[1] 1 1 0

или одну или несколько букв ([A-Za-z]+) от начала до конца, сделайте отрицание (!) и преобразуйте логический вектор в двоичный

as.integer(!grepl("^[A-Za-z]+$", df$state))
#[1] 1 0 1
...