2011-11-17 8 views
15

Bir data.frame'in sonlu olmayan elemanlara sahip olup olmadığını kontrol etmek istiyorum. Bu yukarıdan farklı davranır neden anlamıyorumSonlu olmayanlar için bir data.frame nasıl kontrol edilir

any(!is.finite(x)) 

:

Bu (ı onun bir liste olarak data.frame değerlendirerek tahmin ediyorum) her biri için YANLIŞ dönen, her sütunu değerlendirmek gibi görünüyor Ancak, yalnızca NA'ları denetliyorsa iyi çalışır: Çözümün olabildiğince verimli olmasını isterim. Eğer bunu is.finite ulaşamadığı yerlere muhtemelen bu beklenenden şekilde çalışır açıklayan bir data.frame yöntemi olduğunu göreceksiniz methods(is.na) yazarsanız ben

any(!is.finite(as.matrix(x))) 
+0

Verimlilik iyidir, ancak ... bu testin hızının analizinizde bir darboğaz olduğuna dair herhangi bir kanıtınız var mı? –

+2

Bir darboğaz olması muhtemel değildir. Ben bu soru hakkında daha fazla bilgi edinmek için bir fırsat olarak görüyorum. Ben bir veri.frame farklı bir veri türü – SFun28

cevap

15

... Sadece yapabilirsiniz biliyoruz. Her zamanki çözüm, tek bir satır olduğu için bir tane yazmak olacaktır. Bu belki gibi bir şey, seni alıyorsanız hatayı farz ediyorum

is.finite.data.frame <- function(obj){ 
    sapply(obj,FUN = function(x) all(is.finite(x))) 
} 
+0

dönüştürme için başka bir teknik olarak öğeleri değerlendirmek için bir teknik eksik olup olmadığını merak ediyorum Yöntem() yanı sıra çözüm için işaretçi! Ben "any" yerine "all" kullanırım ve sonlu bir data.frame sütunu sadece sonlu – SFun28

+0

@ SFun28 ile bir sütun olarak tanımlardım İyi nokta, teşekkürler. Çok hızlı yazdım. Noktanızı yansıtacak şekilde düzenlenmiştir. – joran

6

şudur:

> any(is.infinite(z)) 
Error in is.infinite(z) : default method not implemented for type 'list' 

is.infinite() ve is.finite() fonksiyonları veri için bir yöntem ile uygulanmadı çünkü bu hatadır .frames. is.na() işlevinde bir data.frame yöntemi vardır.

Bu şekilde çalışmanın yolu, data.frame'deki her satır, sütun veya öğenin işlevi olan apply() işlevidir. Aşağıda her elemana is.infinite() fonksiyonunu uygulamak için sapply() kullanıldığı bir örnek:

x <- c(1:10, NA) 
y <- c(1:11) 
z <- data.frame(x,y) 
any(sapply(z, is.infinite)) 
## or 

any(! sapply(z, is.finite)) 
3

farklardan biri is.na ve is.finite fonksiyonlarının farklı türleri olmalarıdır. is.na geneldir ve argüman sınıfına göre gönderir. bir is.na.data.frame işlevi olduğunu, özellikle

> methods("is.na") 
[1] is.na.data.frame  is.na.numeric_version is.na.POSIXlt   
[4] is.na.raster*   

    Non-visible functions are asterisked 

not edin. bu işlevin baktığımızda:

> is.na.data.frame 
function (x) 
{ 
    y <- do.call("cbind", lapply(x, "is.na")) 
    if (.row_names_info(x) > 0L) 
     rownames(y) <- row.names(x) 
    y 
} 
<bytecode: 00000000054F40F0> 
<environment: namespace:base> 

eser lapply(x, "is.na") sonucudur birlikte (cbind) sütunları koyar do.call("cbind", lapply(x, "is.na")) çağrıdır yapar parçası. (Mtcars) bir örnek data.frame ile sadece bu Running:

> lapply(mtcars, "is.na") 
$mpg 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

$cyl 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

$disp 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

$hp 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

$drat 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

$wt 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

$qsec 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

$vs 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

$am 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

$gear 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

$carb 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

bu gerçekten sadece bir sütun akıllıca hesaplama olduğunu görüyoruz, bir data.frame içine tekrar bir araya koymak.

is.finite için data.frames için belirli bir işleve sahip değildir ki bu karşılaştır:

> methods("is.finite") 
no methods were found 

Aslında, bu ayrıntıları C kodunda değil, R, kodu olduğu anlamına gelir, ilkel bir yöntemdir.

> is.finite 
function (x) .Primitive("is.finite") 

Eğer is.finite ile bir sütun akıllıca hesaplama yapmak istiyorsanız is.na.data.frame yaptığı gibi, bunu sarabilirsiniz.

> do.call(cbind, lapply(mtcars, is.finite)) 
     mpg cyl disp hp drat wt qsec vs am gear carb 
[1,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[2,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[3,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[4,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[5,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[6,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[7,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[8,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[9,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[10,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[11,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[12,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[13,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[14,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[15,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[16,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[17,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[18,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[19,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[20,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[21,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[22,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[23,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[24,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[25,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[26,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[27,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[28,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[29,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[30,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[31,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[32,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

ikincisi Bu aynı zamanda da,

sapply(mtcars, is.finite) 

olarak en verimli olacağını hiçbir test kazanılmış olabilir.

+0

teşekkürler, Brian! Is.na.data.frame – SFun28

4

as.matrix numaralı aramanızla ilgili çözümünüz yalnızca data.frame yalnızca sayısal sütun içeriyorsa çalışacaktır. Aksi takdirde, matris tipik olarak bir karakter matrisi olur ve sonuç her yerde yanlış olur ...

@joran'ın iyi bir yaklaşımı vardır, ancak faktörler için çok fazla vb. Eğer onay mümkün olduğunca hızlı olmasını istiyorsanız ..

is.finite(letters[1:3])   # FALSE - OK 
is.finite(factor(letters[1:3])) # TRUE - WRONG!! 

is.finite.factor <- function(obj){ 
    logical(length(obj)) 
} 

is.finite(factor(letters[1:3])) # FALSE - OK 

Ayrıca, sen sapply önlemek ve bunun yerine vapply için gitmek gerekir.

d <- data.frame(matrix(runif(1e6), nrow=10), letters[1:10]) 

# @joran's method 
is.finite.data.frame <- function(obj){ 
    sapply(obj,FUN = function(x) all(is.finite(x))) 
} 

system.time(x <- is.finite(d)) # 0.42 secs 

# Using vapply instead... 
is.finite.data.frame <- function(obj) { 
    vapply(obj,FUN = function(x) all(is.finite(x)), logical(1)) 
} 

system.time(y <- is.finite(d)) # 0.20 secs 

identical(x,y) # TRUE 
+0

dökümünü takdir ettim.matrix, factor sütunları ve vapply hakkında harika puanlar! Bu cevap iyi şeylerle dolu. =) – SFun28

İlgili konular