2016-06-08 11 views
7

Mam ramki danych, które skonstruować takie jak:Konwersja kolumnę ramka danych ze znaku numerycznego

> yyz <- data.frame(a = c("1","2","n/a"), b = c(1,2,"n/a")) 

> apply(yyz, 2, class) 
     a   b 
"character" "character" 

Ja próbuje konwertować ostatnią kolumnę chwilę numerycznej zachowaniu pierwszą kolumnę jako znak. Próbowałem tego:

> yyz$b <- as.numeric(as.character(yyz$b)) 
> yyz 
    a b 
    1 1 
    2 2 
    n/a NA 

Ale kiedy prowadzę klasę zastosowania, pokazuje mi się, że obie klasy postaci.

> apply(yyz, 2, class) 
     a   b 
"character" "character" 

Czy ustawienie ramki danych jest nieprawidłowe? A może tak interpretuje ramkę danych R?

+2

Zauważ, że 'klasa (YYZ $ b)' plony ' "liczbowe"' w tym przykładzie. Dlatego kolumna * jest * w rzeczywistości numeryczna. Jak wskazano przez @akrun, widoczne niedopasowanie klas wynika z użycia 'apply()'. – RHertel

Odpowiedz

15

Jeśli potrzebujemy tylko jedną kolumnę, aby być numeric

yyz$b <- as.numeric(as.character(yyz$b)) 

Ale jeśli wszystkie kolumny musi zmienić na numeric użyć lapply do pętli na kolumnach i konwertować do numeric najpierw przez przekształcenie go do character klasie jako kolumny były factor.

yyz[] <- lapply(yyz, function(x) as.numeric(as.character(x))) 

Obie kolumny w stanowisku PO są factor z powodu napisu "n/a". To może być łatwo uniknąć podczas odczytu pliku przy użyciu na.strings = "n/a" w read.table/read.csv lub jeśli używamy data.frame, możemy mieć character kolumny z stringsAsFactors=FALSE (domyślnie jest to stringsAsFactors=TRUE)


chodzi o wykorzystanie apply, przetwarza dataset do matrix i matrix może pomieścić tylko jedną klasę. Aby sprawdzić class, musimy

lapply(yyz, class) 

Or

sapply(yyz, class) 

lub sprawdź

str(yyz) 
+0

Powoduje to konwersję obu kolumn na wartości numeryczne. Chcę tylko, aby kolumna b była numeryczna. Podam yyz $ b <- lapply (yyz $ b, function (x) as.numeric (as.character (x))), zamieni je w listy – Dexstrum

+0

@Dexstrum To dlatego, że przypisujesz listę do kolumny . Jeśli potrzebujemy tylko jednej kolumny jako liczby, użyj tej samej składni, co "yyz $ b <- as.numeric (as.character (yyz $ b))" – akrun

+0

Proszę spojrzeć jeszcze raz na to, co napisałem. Próbowałem już tego i nie zmieniło kolumny na numeryczne. – Dexstrum

Powiązane problemy