Jak przekonwertować kolumnę ramki danych na typ numeryczny?
źródło
Jak przekonwertować kolumnę ramki danych na typ numeryczny?
Ponieważ (wciąż) nikt nie dostał znacznika wyboru, zakładam, że masz na myśli jakiś praktyczny problem, głównie dlatego, że nie określiłeś, jakiego rodzaju wektora chcesz przekonwertować numeric
. Proponuję zastosować transform
funkcję w celu wykonania zadania.
Teraz zamierzam zademonstrować pewną „anomalię konwersji”:
# create dummy data.frame
d <- data.frame(char = letters[1:5],
fake_char = as.character(1:5),
fac = factor(1:5),
char_fac = factor(letters[1:5]),
num = 1:5, stringsAsFactors = FALSE)
Rzućmy okiem na data.frame
> d
char fake_char fac char_fac num
1 a 1 1 a 1
2 b 2 2 b 2
3 c 3 3 c 3
4 d 4 4 d 4
5 e 5 5 e 5
i pozwól nam uruchomić:
> sapply(d, mode)
char fake_char fac char_fac num
"character" "character" "numeric" "numeric" "numeric"
> sapply(d, class)
char fake_char fac char_fac num
"character" "character" "factor" "factor" "integer"
Teraz prawdopodobnie zadajesz sobie pytanie „Gdzie jest anomalia?” Cóż, natknąłem się na dość osobliwe rzeczy w R i nie jest to najbardziej kłopotliwa sprawa, ale może cię to dezorientować, szczególnie jeśli przeczytasz to przed zjechaniem do łóżka.
Oto dwie pierwsze kolumny character
. Ja celowo nazywane 2 nd jeden fake_char
. Dostrzeż podobieństwo tej character
zmiennej do zmiennej, którą Dirk stworzył w swojej odpowiedzi. W rzeczywistości jest to numerical
wektor przekonwertowany na character
. 3 III i 4 p kolumny są factor
, a ostatni jest „wyłącznie” numeric
.
Jeśli korzystasz z transform
funkcji, możesz przekonwertować zmienną fake_char
na numeric
, ale nie char
samą zmienną.
> transform(d, char = as.numeric(char))
char fake_char fac char_fac num
1 NA 1 1 a 1
2 NA 2 2 b 2
3 NA 3 3 c 3
4 NA 4 4 d 4
5 NA 5 5 e 5
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion
ale jeśli zrobisz to samo na, fake_char
i char_fac
będziesz miał szczęście i nie będziesz mieć żadnych NA:
> transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
char fake_char fac char_fac num
1 a 1 1 1 1
2 b 2 2 2 2
3 c 3 3 3 3
4 d 4 4 4 4
5 e 5 5 5 5
Jeśli zapiszesz przekształcone data.frame
i sprawdzisz mode
i class
, otrzymasz:
> D <- transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
> sapply(D, mode)
char fake_char fac char_fac num
"character" "numeric" "numeric" "numeric" "numeric"
> sapply(D, class)
char fake_char fac char_fac num
"character" "numeric" "factor" "numeric" "integer"
Wniosek jest następujący: Tak, możesz przekonwertować character
wektor na numeric
jeden, ale tylko wtedy, gdy jego elementy są „konwertowalne” na numeric
. Jeśli character
w wektorze jest tylko jeden element, podczas próby konwersji tego wektora na numerical
jeden wystąpi błąd .
I tylko, aby udowodnić mój punkt widzenia:
> err <- c(1, "b", 3, 4, "e")
> mode(err)
[1] "character"
> class(err)
[1] "character"
> char <- as.numeric(err)
Warning message:
NAs introduced by coercion
> char
[1] 1 NA 3 4 NA
A teraz, dla zabawy (lub ćwiczenia), spróbuj odgadnąć wyjście tych poleceń:
> fac <- as.factor(err)
> fac
???
> num <- as.numeric(fac)
> num
???
Pozdrawiam Patrick Burns! =)
Coś, co mi pomogło: jeśli masz zakresy zmiennych do konwersji (lub tylko więcej niż jeden), możesz użyć
sapply
.Trochę bezsensowne, ale tylko na przykład:
Powiedzmy, że kolumny 3, 6-15 i 37 twojej ramki danych muszą zostać przekonwertowane na numeryczne, że można:
źródło
sapply
połączenieas.data.frame()
po prawej stronie, jak sugerował poniżej @Mehrad Mahmoudian, zadziała.jeśli
x
jest nazwą kolumny ramki danychdat
ix
jest typu, użyj:źródło
as.character
rzeczywiście było tym, czego szukałem. W przeciwnym razie konwersja czasami się nie powiedzie. Przynajmniej w moim przypadku.Error: (list) object cannot be coerced to type 'double'
chociaż byłem dość pewien, że mój wektor nie ma znaków / znaków interpunkcyjnych. Potem spróbowałemas.numeric(as.character(dat$x))
i zadziałało. Teraz nie jestem pewien, czy moja kolumna jest w rzeczywistości tylko liczbami całkowitymi, czy nie!Dodałbym komentarz (niska ocena)
Wystarczy dodać na user276042 i pangratz
Spowoduje to zastąpienie wartości istniejącej kolumny x
źródło
Chociaż twoje pytanie dotyczy wyłącznie liczb, istnieje wiele konwersji, które trudno zrozumieć na początku R. Postaram się zająć metodami, które pomogą. To pytanie jest podobne do tego pytania .
Konwersja typów może być uciążliwa w R, ponieważ (1) czynników nie można bezpośrednio przekonwertować na wartości liczbowe, najpierw należy je przekonwertować na klasę znaków, (2) daty są szczególnym przypadkiem, z którym zwykle trzeba sobie poradzić osobno, i (3) zapętlanie kolumn kolumn danych może być trudne. Na szczęście „tidyverse” rozwiązało większość problemów.
W tym rozwiązaniu
mutate_each()
zastosowano funkcję do wszystkich kolumn w ramce danych. W tym przypadku chcemy zastosowaćtype.convert()
funkcję, która konwertuje ciągi znaków na wartości liczbowe tam, gdzie to możliwe. Ponieważ R uwielbia czynniki (nie wiem dlaczego) kolumny znaków, które powinny pozostać, zostaną zmienione na czynniki. Aby to naprawić,mutate_if()
funkcja służy do wykrywania kolumn, które są czynnikami i zmieniają się w znak. Na koniec chciałem pokazać, jak można użyć lubridate, aby zmienić znacznik czasu w klasie postaci na datę i godzinę, ponieważ jest to często blokada dla początkujących.źródło
mutate_all(type.convert, as.is=TRUE)
zamiastmutate_all(type.convert)
, możesz usunąć / uniknąć,mutate_if(is.factor, as.character)
aby skrócić polecenie.as.is
jest argumentemtype.convert()
wskazującym, czy powinien konwertować ciągi znaków jako znaki, czy jako czynniki. Domyślnieas.is=FALSE
intype.convert()
(tzn. Konwertuje ciągi znaków na klasę współczynnika zamiast na klasę znaków).Tim ma rację, a Shane ma pominięcie. Oto dodatkowe przykłady:
Nasz
data.frame
teraz ma podsumowanie kolumny czynników (liczby) i podsumowania liczboweas.numeric()
--- co jest nieprawidłowe, ponieważ ma poziomy liczbowe współczynników --- oraz (poprawne) podsumowanieas.numeric(as.character())
.źródło
Za pomocą następującego kodu możesz przekonwertować wszystkie kolumny ramek danych na wartości liczbowe (X to ramka danych, którą chcemy przekonwertować to kolumny):
a do konwersji całej macierzy na wartości liczbowe masz dwa sposoby: albo:
lub:
Alternatywnie możesz użyć
data.matrix
funkcji, aby przekonwertować wszystko na wartości liczbowe, chociaż pamiętaj, że czynniki mogą nie zostać poprawnie przekonwertowane, więc bezpieczniej jest przekonwertować wszystko nacharacter
najpierw:Zazwyczaj używam tego ostatniego, jeśli chcę jednocześnie przekonwertować na macierz i cyfrę
źródło
Jeśli wystąpią problemy z:
Spójrz na swoje znaki dziesiętne. Jeśli są „,” zamiast „.” (np. „5,3”) powyższe nie będzie działać.
Potencjalnym rozwiązaniem jest:
Uważam, że jest to dość powszechne w niektórych krajach nieanglojęzycznych.
źródło
Uniwersalny sposób za pomocą
type.convert()
irapply()
:źródło
as.is = TRUE
jeśli chcesz przekonwertować swoją postać namatrix
na zmiany numeryczne, zignorowanyclasses=matrix
pierwszy argument musi mieć postać trybuAby przekonwertować kolumnę ramki danych na numeryczną, wystarczy:
współczynnik na wartość liczbową: -
źródło
sapply(data_frame,function(x) as.numeric(as.character(x)))
Chociaż inni dość dobrze omawiali ten temat, chciałbym dodać tę dodatkową szybką myśl / wskazówkę. Możesz użyć wyrażenia regularnego, aby z góry sprawdzić, czy znaki potencjalnie składają się tylko z cyfr.
Bardziej wyrafinowane wyrażenia regularne i ciekawe, dlaczego warto uczyć się / doświadczać ich mocy, zobacz tę naprawdę fajną stronę internetową: http://regexr.com/
źródło
Biorąc pod uwagę, że mogą istnieć kolumny char, jest to oparte na @Abdou w Uzyskaj typy kolumn arkusza programu Excel automatycznie odpowiedz:
źródło
Na moim komputerze (R v.3.2.3)
apply
lubsapply
podaj błąd.lapply
działa dobrze.źródło
Jeśli ramka danych ma wiele typów kolumn, niektóre znaki, niektóre wartości liczbowe, spróbuj wykonać następujące czynności, aby przekonwertować tylko kolumny zawierające wartości liczbowe na wartości liczbowe:
źródło
z hablar :: konwersją
Aby łatwo przekonwertować wiele kolumn na różne typy danych, których możesz użyć
hablar::convert
. Prosta składnia:df %>% convert(num(a))
konwertuje kolumnę a z df na numeryczną.Szczegółowy przykład
Pozwala przekonwertować wszystkie kolumny
mtcars
na znak.Z
hablar::convert
:prowadzi do:
źródło
Aby przekonwertować znak na numeryczny, musisz go przekonwertować na współczynnik, stosując
Musisz utworzyć dwie kolumny z tymi samymi danymi, ponieważ jedna kolumna nie może zostać przekonwertowana na liczbę. Jeśli wykonasz jedną konwersję, pojawi się poniższy błąd
więc po wykonaniu dwóch kolumn tych samych danych stosuje się
z powodzeniem przekształci znak w numeryczny
źródło
df
istnieje twoja ramka danych.x
to kolumna,df
którą chcesz przekonwertowaćźródło
Jeśli nie zależy ci na zachowaniu czynników i chcesz zastosować je do dowolnej kolumny, którą można przekonwertować na wartości liczbowe, skorzystałem ze skryptu poniżej. jeśli df jest twoją oryginalną ramką danych, możesz użyć skryptu poniżej.
I odwołuje Shane'a and Jøran za rozwiązanie btw
źródło