2014-09-16 21 views
5

Tôi đã sau khung dữ liệu:Kiểm tra nếu một biến là một số trong R

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

tôi cố gắng để có được xx từ DDF sử dụng lệnh sau:

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

Làm thế nào tôi có thể kiểm tra nếu xx là một số hợp lệ và không phải là 'số (0)'. Tôi đã thử theo dõi:

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

EDIT: Tôi phải yêu cầu "xx = ddf [ddf $ name == 'a', 'value']" từ các khung dữ liệu ddf khác nhau. Đôi khi ddf không chứa 'a' và do đó không có giá trị nào được trả về. Tôi muốn phát hiện điều này.

+0

Lưu ý tuy nhiên rằng "số hợp lệ" không phải là một tham số trong 'r'. Điều gì sẽ xảy ra nếu bạn không muốn cho phép các giá trị 'NA' hoặc' Inf'? Hãy chắc chắn rằng bạn biết chính xác những gì bạn cần để kiểm tra! –

+0

Bạn có thể kiểm tra chiều dài của nó –

+0

Tôi đã chỉnh sửa câu hỏi của mình cho chính xác những gì tôi cần. Tôi nghĩ chiều dài (xx)> 0 sẽ là tốt nhất. – rnso

Trả lời

6

Cách dễ nhất để thực hiện việc này bằng cơ sở R là kiểm tra độ dài xx.

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

Nếu bạn muốn kiểm tra xem biến cũng là sử dụng số is.numeric

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

Ví dụ, lấy ví dụ của bạn:

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

Điều đó chỉ xác minh có "cái gì đó", nhưng không phải là nó 'số' thay vì một số lớp khác, vì vậy điều này cần phải được thêm vào, chứ không phải thay vì, mã của OP. Chỉ muốn làm rõ điểm đó. –

+0

@CarlWitthoft tùy thuộc vào tình huống có thể hoặc có thể không phải là một vấn đề, dù sao, tôi đã cập nhật mã. – nico

+0

Cảm ơn - chỉnh sửa chi tiết đẹp ở đó! –

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

Kết hợp hai thử nghiệm này. Trước hết, kiểm tra rằng xx có lớp numeric (integer cũng được chấp nhận, vì kiểm tra cơ bản được thực hiện bởi is.numeric) và thứ hai kiểm tra độ dài xx là một.

0

Các mã sau sử dụng biểu thức thông thường để xác nhận rằng chuỗi ký tự chứa các chữ số và có ít nhất một chữ số. Xem dưới đây:

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

Hoặc nếu bạn cần để đối phó với số âm và chữ số thập phân:

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

Điều gì về dấu thập phân? – rnso

Các vấn đề liên quan