2014-09-16 3 views
5

Я следующий кадр данных:Проверка, является ли переменная числом в R

> ddf = data.frame(name=c('a','b'), value=c(10,20)) 
> ddf 
    name value 
1 a 10 
2 b 20 

Я пытаюсь получить хх от DDF, используя следующую команду:

> xx = ddf[ddf$name=='a','value'] 
> xx 
[1] 10 
> xx = ddf[ddf$name=='c','value'] 
> xx 
numeric(0) 

Как я могу проверить, если хх действительное число, а не «числовое (0)». Я попробовал следующее:

> is.numeric(xx) 
[1] TRUE 
> is.na(xx) 
logical(0) 
> is.null(xx) 
[1] FALSE 
> is.logical(xx) 
[1] FALSE 

EDIT: Я должен попросить "хх = DDF [DDF $ имя == 'а', 'значение']" из разных DDF данных. Иногда ddf не содержит «a», и, следовательно, значение не возвращается. Я хочу это обнаружить.

+0

Однако обратите внимание, что «действительный номер» не является параметром в 'r'. Что делать, если вы не хотите разрешать значения 'NA' или' Inf'? Убедитесь, что вы точно знаете, что вам нужно проверить! –

+0

Вы можете проверить его длину –

+0

Я отредактировал мой вопрос, для чего именно мне нужно. Я думаю, что длина (xx)> 0 будет лучше. – rnso

ответ

6

Самый простой способ сделать это с использованием базы R - проверить длину xx.

if(length(xx)>0) 
    { 
    <do something> 
    } 

Если вы хотите, чтобы проверить, что переменная также числовое использование is.numeric

if (length(xx)>0 & is.numeric(xx)) 

Например, принимая ваш пример:

xx <- ddf[ddf$name=='a','value'] 

is.numeric(xx) & length(xx)>0 
[1] TRUE 


xx <- ddf[ddf$name=='c','value'] 

is.numeric(xx) & length(xx)>0 
[1] FALSE 


xx <- ddf[ddf$name=='a','name'] 

is.numeric(xx) & length(xx)>0 
[1] FALSE 
+0

Это только проверяет, что есть что-то там, но не то, что это 'numeric', а не какой-то другой класс, поэтому это должно быть в дополнение, а не вместо кода OP. Просто хотел прояснить этот момент. –

+0

@CarlWitthoft в зависимости от ситуации, которая может быть или не быть проблемой, во всяком случае, я обновил код. – nico

+0

Спасибо - красивые подробные изменения там! –

4
library(assertive) 
is_a_number(xx)   # returns TRUE or FALSE 
assert_is_a_number(xx) # throws an error if not TRUE 

Это комбинирует два теста. Во-первых, он проверяет, что xx имеет класс numeric (integer в порядке, так как базовая проверка выполняется is.numeric), а во-вторых, он проверяет, что длина xx - одна.

0

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

grepl("^[0-9]{1,}$", xx) 

Или, если вам придется иметь дело с отрицательными числами и знаков после запятой:

grepl("^[-]{0,1}[0-9]{0,}.{0,1}[0-9]{1,}$", xx) 
+0

Как насчет десятичной точки? – rnso

Смежные вопросы