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?

Author: MichaelChirico, 2011-03-01

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.

 168
Author: Michał,
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.

 69
Author: Gavin Simpson,
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
 46
Author: petrelharp,
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.

 9
Author: user8341,
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
 0
Author: Trisquel,
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