2016-04-19 5 views
1

Ich arbeitete mit dem eingebauten Datensatz (ggplot2), genannt diamonds. Nachdem ich dia1 zugewiesen hatte, führte ich das folgende Skript aus, um die Werte nach ihrem Karat zu gruppieren. Ich habe eine Nachricht über NAs durch Zwang eingeführt bekommen. Ich verstehe nicht, wie das passiert wäre, wie auch aus der Summe des Vektors is.na(), der gleich null ist.Fehlender Wert eingeführt in einer logischen

#data 
library(ggplot2) 
dia1 <- diamonds 

#logic 
x<-1 
dia1$carat<-as.character(dia1$carat) 
for (i in 1:(length(dia1$carat))){ 

if (0<(as.numeric(dia1$carat[x]))&(as.numeric(dia1$carat[x]))<=1){ 
    dia1$carat[x]<-"0-1" 
} 
if (1 < (as.numeric(dia1$carat[x]))&(as.numeric(dia1$carat[x])) <= 2){ 
    dia1$carat[x]<-"1-2" 
} 
if (2<(as.numeric(dia1$carat[x]))&(as.numeric(dia1$carat[x]))<=3){ 
    dia1$carat[x]<-"2-3" 
} 
if (3<(as.numeric(dia1$carat[x]))&(as.numeric(dia1$carat[x]))<=4){ 
    dia1$carat[x]<-"3-4" 
} 
if (4<(as.numeric(dia1$carat[x]))&(as.numeric(dia1$carat[x]))<=5){ 
    dia1$carat[x]<-"4-5" 
} 
    x<-x+1 
} 

Fehler if (0 < (as.numeric (dia1 $ Karat [x])) & (as.numeric (dia1 $ Karat [x])) <: Wert fehlt, wo TRUE/FALSCH Zusätzlich benötigt: Warnmeldungen: 1: NAs eingeführt durch Zwang 2: NAs

durch Zwang eingeführt
# check if there are any NAs in the data 
sum(is.na(dia1$carat)) 
[1] 0 

Alternativ warum gab es keine NAs eingeführt w Henne der dia1$carat Vektor wurde explizit zu einem Zeichen gezwungen, aber es wurden NAs in die Rücktransformation eingeführt?

+1

'schneiden (dia $ Karat, bricht = 0: 6, Etiketten = c ("0-1" , "1-2", "2-3", "3-4", "4-5", "5-6"), include.lowest = TRUE) 'wird wahrscheinlich sehr viel effizienter sein. Und Sie sollten wahrscheinlich einen 'Bereich (dia $ carat)' machen, um Ihre Annahmen zu bestätigen. – hrbrmstr

+0

@hrbrmstr Danke. Wird benutzen. Aber als Lernziel wollte ich wissen, was mit meinem Code schief gelaufen ist. –

+1

Wie gesagt, Sie möchten vielleicht einen 'Bereich (dia $ carat)' machen, um Ihre Annahmen zu überprüfen. Und 'for' +' if' == python/C/Java, nicht R. – hrbrmstr

Antwort

2

Das Problem ist, dass wir NA-if() liefern, versuchen Sie folgendes Beispiel:

if(NA > 1){1} else {2} 

Fehler if (NA> 1) {: fehlender Wert in die WAHR/FALSCH benötigt

In Ihrem Fall, wenn wir erste Reihe betrachten Karat ist "0.23", erste if() Anweisung bewertet es richtig nach es in eine Zahl umwandeln und dann innerhalb des Bereichs einen neuen Wert von "0-1" zuweisen. Dann versucht der zweite if()"0-1" zu numerisch zu konvertieren, so erhalten wir NA.

Andere Beratung über den Code:

  • Verwenden Sie einfach cut()
  • Verwenden if(){...} else if(){...} ...
  • ich nicht, warum wir x Variable haben, wir i stattdessen verwenden könnte.
  • Lesen Sie mehr über seq_along(), summary(), str()
  • Verwenden temporäre Variable für as.numeric(dia1$carat[x])
  • Verwenden Whitespaces
Verwandte Themen