2017-09-22 5 views
0

Die obige Funktion soll einen logischen Vektor zurückgeben, der mir sagt, ob die Spalte in einem Datenrahmen nur numerische Zeichen hat. Es scheint jedoch, einen falschen Wert zurückzugeben, wenn ich es für die erste Spalte (vielleicht sogar die ersten beiden) ausführen.Gebrochene Funktion/logischer Vektor-r

mydf <- data.frame(new = letters[11:20], 
       a = rnorm(10), 
       b = letters[1:10], 
       c = LETTERS[1:10], 
       d = rnorm(10)) 

Wenn ich die oben df eingeben, sollte es eine logische Vektor FALSCH RICHTIG FALSCH FALSCH TRUE zurück, aber ich bekomme diese:

num_only(mydf) 
[1] FALSE FALSE FALSE FALSE TRUE 

Ich bin nicht sicher, was falsch ist. Kann jemand helfen?

Antwort

1

Sie möchten ifelse nicht, da Sie jeweils nur einen logischen Wert testen. Und der Rückkehrvektor sollte außerhalb der Schleife for erstellt werden.
Auch gibt es eine viel einfachere und R-ish Lösung, die nicht gleichwertig ist, sondern bestimmt, ob eine Spalte der Klasse numeric oder nicht ist. Vielleicht interessiert es dich.

num_only <- function(df) { 
    num_cols <- vector("logical", length = ncol(df)) 
    for (clm in seq_along(df)) { 
     num_cols[[clm]] <-if(length(grep('[A-Za-z]', df[[clm]])) == 0) 
      TRUE 
     else 
      FALSE 
    } 
    return(num_cols) 
} 

num_only2 <- function(df) unname(sapply(df, is.numeric)) 

num_only(mydf) 
#[1] FALSE TRUE FALSE FALSE TRUE 

num_only2(mydf) 
#[1] FALSE TRUE FALSE FALSE TRUE 
+0

Super, danke dafür. Ich habe über deine zweite Funktion nachgedacht, außer dass die df-Spalten alle Zeichenklassen sind, also dachte ich nicht, dass is.numeric funktionieren würde –