2016-06-14 13 views
0

Ich habe ein Dataset, in dem ich die NA-Werte herausgefiltert habe und plane, ein allgemeines lineares Modell zu erstellen, um Dinge vorherzusagen. Allerdings, wenn ich dies tun:R endliche Werte im Datensatz lokalisieren

 model<-bayesglm(total_score ~ ., data=traint) 

bekomme ich folgende Fehlermeldung:

 Error in lm.fit(x = x.star[good.star, , drop = FALSE] * w.star, y = z.star * : 
     NA/NaN/Inf in 'y' 

Basierend auf einem früheren Post: lm() NA/NaN/Inf error, Ich versuche, die endliche Werte des Datensatzes zu beseitigen ....

Nachdem für eine solche endliche Werte geprüft mit:

 summary(timesData) 

    output too long to show 

ich kein Symbol, das mich finden können, wie der Teilmenge der Daten in einer solchen Art und Weise erzählt, dass ich diese endliche Werte herauszufiltern ....

ist mein Versuch, diese ohnehin tun, wie folgt:

train<-subset(timesData, !is.finite(timesData)) 

Natürlich, da ich keine Spalte angegeben habe ich bekommen:

Error in is.finite(timesData) : 
    default method not implemented for type 'list' 

ich versuchte lapply:

lapply(timesData, byrow=F, is.finite(timesData)) 

aber

Error in FUN(X[[i]], ...) : 
     2 arguments passed to 'is.finite' which requires 1 

Insgesamt also meine Frage ist, wie finde ich die Werte im Datensatz, die endlich sind, wenn ‚Zusammenfassung()‘ offenbaren nicht die Spalten, in denen sie sich befinden, und auch, wie kann ich lapply um dann loszuwerden?

Meine Daten auf Kaggle öffentlich verfügbar: https://www.kaggle.com/mylesoneill/world-university-rankings

Antwort

2

Hier etwas, das Sie versuchen können, ist es seltsam, dass is.finite und is.infinite keine Datenrahmen allerdings nicht unterstützen, da eine ähnliche Funktion wie is.na tut:

timesData[apply(timesData, 1, function(row) all(is.finite(row))),] 

Eine alternative Methode wäre, das timesData zu konvertieren Matrix und dann verwenden und is.finiteis.infinite von denen beide für die Klasse „Matrix“ implementiert:

timesData[rowSums(is.infinite(as.matrix(timesData))) == 0, ] 

Dies sollte in der Regel schneller als die apply Methode sein.

+0

Ersetzen Sie einfach "is.na" 'mit' "is.finite" 'in' is.na.data.frame' und vuala - Sie haben eine Methode für Datenrahmen. :) Wahrscheinlich, warum gibt es keine Methode. Zu einfach. –

2

Ein Weg, es zu lösen, ist in den Spalten in einer Schleife, und unendliche Werte von einigem vernünftigen Wert, wie Null oder -1 (abhängig von Ihren Daten) Zum Beispiel ersetzen:

for (f in names(train)) { 
    timesData[,f]<-ifelse(is.finite(timesData[,f]), timesData[,f], -1) 
} 
3
 df = data.frame(
     a = c(2,4/0,5), 
     b = c(1/0,3,5), 
     c = c(4,3,5)) 
    df 
     a b c 
    1 2 Inf 4 
    2 Inf 3 3 
    3 5 5 5 

#which columns have infinite values 
is.infinite(colSums(df)) 
    a  b  c 
TRUE TRUE FALSE 

#only rows with finite values 
    df[is.finite(rowSums(df)), ] 
     a b c 
    3 5 5 5 

#or with apply and all  
    df[apply(apply(df, 2,is.finite),1,all),] 
     a b c 
    3 5 5 5 
Verwandte Themen