Powinienem użyć danych.ramka czy matryca?
Kiedy należy użyć data.frame
, a kiedy lepiej użyć matrix
?
Obie przechowują dane w formacie prostokątnym, Więc czasami jest to niejasne.
Czy są jakieś ogólne zasady, kiedy używać jakiego typu danych?
5 answers
Część odpowiedzi znajduje się już w twoim pytaniu: używasz ramek danych, jeśli można oczekiwać, że kolumny (zmienne)będą różnych typów (numeryczne/znakowe/logiczne itp.). Macierze są dla danych tego samego typu.
W konsekwencji wybór macierzy / danych.ramka jest problematyczna tylko wtedy, gdy masz dane tego samego typu.
Odpowiedź zależy od tego, co zamierzasz zrobić z danymi w danych.ramka / matryca. Jeśli ma być przekazany do innych funkcji, to oczekiwany Typ argumenty tych funkcji decydują o wyborze.
Także:
Macierze są bardziej wydajne w pamięci:
m = matrix(1:4, 2, 2)
d = as.data.frame(m)
object.size(m)
# 216 bytes
object.size(d)
# 792 bytes
Macierze są koniecznością, jeśli planujesz wykonać dowolne operacje typu algebry liniowej.
Ramki danych są wygodniejsze, jeśli często odnosisz się do ich kolumn po nazwie (poprzez Kompaktowy operator$).
Ramki danych są IMHO lepsze do raportowania (drukowania) informacji tabelarycznych, ponieważ można zastosować formatowanie do każdej kolumny osobno.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 00:12:26
@ Michal nie wspomina o tym, że nie tylko macierz jest mniejsza od równoważnej ramki danych, ale użycie macierzy może sprawić, że Twój kod będzie o wiele bardziej wydajny niż użycie ramek danych, często znacznie bardziej. Jest to jeden z powodów, dla których wewnętrznie, wiele funkcji R będzie wymuszać dane macierzy, które są w ramkach danych.
Ramki danych są często o wiele wygodniejsze; nie zawsze istnieją tylko atomowe fragmenty danych.
Zauważ, że możesz mieć macierz znaków; nie musisz mieć tylko danych liczbowych, aby zbudować macierz w R.
Konwertując ramkę danych na macierz, należy zauważyć, że istnieje funkcja data.matrix()
, która odpowiednio obsługuje czynniki, konwertując je na wartości liczbowe oparte na poziomach wewnętrznych. Wymuszenie przez as.matrix()
spowoduje powstanie macierzy znaków, jeśli którakolwiek z etykiet czynnika nie jest numeryczna. Porównaj:
> head(as.matrix(data.frame(a = factor(letters), B = factor(LETTERS))))
a B
[1,] "a" "A"
[2,] "b" "B"
[3,] "c" "C"
[4,] "d" "D"
[5,] "e" "E"
[6,] "f" "F"
> head(data.matrix(data.frame(a = factor(letters), B = factor(LETTERS))))
a B
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 4
[5,] 5 5
[6,] 6 6
Prawie zawsze używam ramki danych do moich zadań analizy danych, ponieważ często mam więcej niż tylko zmienne numeryczne. Kiedy Ja funkcje kodu dla pakietów, prawie zawsze wymuszam na macierzy, a następnie formatuję wyniki jako ramkę danych. Dzieje się tak dlatego, że ramki danych są wygodne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 19:14:42
@Michal: Macierze nie są tak naprawdę bardziej wydajne w pamięci:
m <- matrix(1:400000, 200000, 2)
d <- data.frame(m)
object.size(m)
# 1600200 bytes
object.size(d)
# 1600776 bytes
... chyba, że masz dużą liczbę kolumn:
m <- matrix(1:400000, 2, 200000)
d <- data.frame(m)
object.size(m)
# 1600200 bytes
object.size(d)
# 22400568 bytes
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-23 14:06:07
Macierz jest właściwie wektorem z dodatkowymi metodami. while data.ramka to lista. Różnica sprowadza się do wektora vs listy. aby uzyskać wydajność obliczeń, trzymaj się matrycy. Korzystanie z danych.kadruj, jeśli musisz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 21:28:30
Macierze i ramki danych są prostokątnymi tablicami 2D i mogą być niejednorodne przez wiersze i Kolumny . Dzielą się kilkoma metodami i właściwości, ale nie wszystkie.
Przykłady:
M <- list(3.14,TRUE,5L,c(2,3,5),"dog",1i) # a list
dim(M) <- c(2,3) # set dimensions
print(M) # print result
# [,1] [,2] [,3]
# [1,] 3.14 5 "dog"
# [2,] TRUE Numeric,3 0+1i
DF <- data.frame(M) # a data frame
print(DF) # print result
# X1 X2 X3
# 1 3.14 5 dog
# 2 TRUE 2, 3, 5 0+1i
M <- matrix(c(1,1,1,1,2,3,1,3,6),3) # a numeric matrix
DF <- data.frame(M) # a all numeric data frame
solve(M) # obtains inverse matrix
solve(DF) # obtains inverse matrix
det(M) # obtains determinant
det(DF) # error
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-10 02:50:26