Funkcja macierzowa w R: Utwórz, wydrukuj, dodaj kolumnę i plasterek

⚡ Inteligentne podsumowanie

Matrix w R to dwuwymiarowa tablica zawierająca pojedynczy typ danych w m wierszach i n kolumnach, utworzona za pomocą funkcji matrix(), rozszerzona za pomocą cbind() i rbind(), dostępna za pomocą nawiasów kwadratowych.

  • 🧩 Struktura: Macierz jest wektorem z atrybutem dim, dlatego każda komórka musi współdzielić jeden typ danych.
  • 🛠️. Kreacja: macierz(data, nrow, ncol, byrow) układa sekwencję, a R wnioskuje o brakującym wymiarze.
  • 🔄 Wypełnij zamówienie: byrow = FALSE wypełnia kolumna po kolumnie, natomiast byrow = TRUE wypełnia wiersz po wierszu.
  • Wzrost: cbind() dołącza kolumny, a rbind() dołącza wiersze, pod warunkiem, że współdzielony wymiar jest zgodny.
  • Krajanie na plastry: m[wiersz, kolumna] najpierw odczytuje wiersze, a pusta strona zaznacza wszystko, co znajduje się po tej stronie.
  • 🏷️ Etykiety: dimnames, rownames() i colnames() zastępują symbole zastępcze [,1] czytelnymi nazwami.
  • ➕➖ Arytmetyka: Gwiazdka mnoży element po elemencie, natomiast %*% wykonuje mnożenie macierzy.

Funkcja macierzowa w R Utwórz Drukuj Dodaj Kolumnę i Wycinek

Funkcja macierzowa w R

Funkcja macierzowa w R jest dwuwymiarową tablicą zawierającą m wierszy i n kolumn. Innymi słowy, macierz w programowaniu w języku R jest kombinacją dwóch lub więcej wektorów o tym samym typie danych.

Poniżej macierz to po prostu wektor z atrybutem dim o długości dwóch. Dlatego każdy element musi mieć jeden typ: w momencie, gdy wartość znaku łączy się z liczbami, cała macierz jest przekształcana na znak. R przechowuje wartości w jednym przebiegu kolumnowym i używa dim do decydowania, gdzie kończy się każdy wiersz, więc wybór… typ danych dotyczy całego obiektu na raz.

Uwaga: Funkcja matrix() zawsze zwraca dokładnie dwa wymiary. Aby zbudować strukturę z trzema lub więcej wymiarami w R, użyj funkcji array() z wektorem dim lub przypisz funkcję dim() bezpośrednio. Poniższy diagram przedstawia układ wierszy i kolumn każdej macierzy.

Układ wierszy i kolumn funkcji macierzowej w R

Jak utworzyć macierz w R

Możemy utworzyć macierz za pomocą funkcji matryca()Podstawowy podpis R przyjmuje pięć argumentów, a trzy najczęściej używane przedstawiono tutaj:

matrix(data, nrow, ncol, byrow = FALSE)

argumenty:

  • dane:Zbiór elementów, które R uporządkuje w wiersze i kolumny macierzy.
  • nrów:Liczba wierszy.
  • nkol: Liczba kolumn.
  • obok: Flaga logiczna. Przy domyślnym ustawieniu byrow = FALSE macierz jest wypełniana kolumna po kolumnie, od góry do dołu. Przy ustawieniu byrow = TRUE macierz jest wypełniana wiersz po wierszu, od lewej do prawej.
  • dimnames:Opcjonalna lista o długości dwóch zawierająca nazwy wierszy i nazwy kolumn.

Przed pierwszym przykładem warto poznać dwa szczegóły z odniesienia R bazowego. Jeśli podany jest tylko jeden z argumentów nrow i ncol, R wnioskuje o drugim na podstawie długości danych. A jeśli dane zawierają zbyt mało elementów, aby wypełnić żądany kształt, wartości są ponownie przetwarzane, a nie odrzucane.

Utwórzmy dwie macierze 5×2 z ciągu liczb od 1 do 10, jedną z byrow = TRUE i jedną z byrow = FALSE, aby zobaczyć różnicę.

# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow =  TRUE 
matrix_a <-matrix(1:10, byrow = TRUE, nrow = 5)
matrix_a

Wyjście:

Ponieważ użyto byrow = TRUE, konsola wypełnia pierwszy wiersz wartościami 1 i 2, drugi wiersz wartościami 3 i 4 itd.

Wyjście konsoli matrix_a wypełnione wiersz po wierszu przy użyciu byrow = TRUE

Teraz wydrukujmy wymiar macierzy w R za pomocą dim(). Składnia drukowania macierzy w R za pomocą dim() jest następująca:

# Print dimension of the matrix with dim()
dim(matrix_a)

Wyjście:

## [1] 5 2

dim() najpierw zwraca liczbę wierszy, a potem liczbę kolumn, potwierdzając kształt 5×2.

Wypełnij macierz kolumnami z byrow = FALSE

Te same dziesięć liczb i ten sam rząd tworzą inny układ po zmianie kierunku wypełniania.ping byrow domyślnie wysyła wartości w dół pierwszej kolumny przed rozpoczęciem przetwarzania drugiej.

# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow =  FALSE
matrix_b <-matrix(1:10, byrow = FALSE, nrow = 5)
matrix_b

Wyjście:

Wyjście konsoli matrix_b wypełnione kolumna po kolumnie z byrow = FALSE

Ponownie wydrukuj wymiar macierzy za pomocą dim(). Poniżej znajduje się składnia wymiaru matrycy drukującej R:

# Print dimension of the matrix with dim()
dim(matrix_b)

Wyjście:

## [1] 5 2

Kształt pozostaje niezmieniony przy wymiarach 5×2, ponieważ rząd zmienia kolejność wypełniania, a nigdy wymiary.

Note:Użycie polecenia matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) będzie miało taki sam efekt jak powyżej, ponieważ R wnioskuje nrow = 5 z dziesięciu dostarczonych wartości.

Możesz również utworzyć macierz 4×3 za pomocą ncol. R utworzy 3 kolumny i wypełni każdą z nich od góry do dołu. Sprawdź przykład.

matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c

Wyjście:

##       [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12

Nagłówki kolumn od [,1] do [,3] i etykiety wierszy od [1,] do [4,] to domyślne symbole zastępcze języka R. Znikają one po podaniu rzeczywistych nazw wymiarów, jak pokazano dalej w tym samouczku.

Przykład:

dim(matrix_c)

Wyjście:

## [1] 4 3

Dodaj kolumnę do macierzy za pomocą cbind()

Możesz dodać kolumnę do macierzy R za pomocą polecenia cbind(). cbind() oznacza powiązanie kolumn i umożliwia łączenie dowolnej liczby macierzy lub kolumn. Na przykład, w poprzednim przykładzie utworzyliśmy macierz 5×2. Łączymy trzecią kolumnę i sprawdzamy, czy wymiar wynosi 5×3.

Przykład:

# concatenate c(1:5) to the matrix_a
matrix_a1 <- cbind(matrix_a, c(1:5))
# Check the dimension
dim(matrix_a1)

Wyjście:

## [1] 5 3

Przykład:

matrix_a1

Wydajność

##       [,1] [,2] [,3]
## [1,]    1    2    1
## [2,]    3    4    2
## [3,]    5    6    3
## [4,]    7    8    4
## [5,]    9   10    5

Przykład:

Możemy również powiązać więcej niż jedną kolumnę naraz. Następny blok tworzy macierz matrix_a2, macierz 4×3 zawierającą liczby od 13 do 24, dzięki czemu można ją połączyć z macierzą 4×3 matrix_c, aby uzyskać wynik 4×6 obejmujący liczby od 1 do 24.

matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)

Wyjście:

##      [,1] [,2] [,3]
## [1,]   13   17   21
## [2,]   14   18   22
## [3,]   15   19   23
## [4,]   16   20   24

Przykład:

matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)		
matrix_d <- cbind(matrix_a2, matrix_c)
dim(matrix_d)

Wyjście:

## [1] 4 6

UWAGALiczba wierszy macierzy w R musi być równa, aby funkcja cbind() działała. Gdy się różnią, R albo przetwarza krótsze dane wejściowe, albo zgłasza błąd, więc sprawdzenie dim() najpierw dla obu obiektów jest bezpieczniejszym nawykiem.

Podczas gdy cbind() łączy kolumny, rbind() dołącza wiersze. Dodajmy jeden wiersz do naszej macierzy matrix_c i sprawdźmy, czy wymiar wynosi 5×3.

matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
# Create a vector of 3 columns
add_row <- c(1:3)
# Append to the matrix
matrix_c <- rbind(matrix_c, add_row)
# Check the dimension
dim(matrix_c)

Wyjście:

## [1] 5 3

Należy zauważyć, że powiązanie nazwanego wektora, takiego jak add_row, również nadaje nowemu wierszowi tę nazwę, co jest pierwszym krokiem w kierunku macierzy oznaczonych, omówionych dalej.

Pokrój matrycę

Możemy wybrać jeden lub wiele elementów z macierzy w Programowanie R używając nawiasów kwadratowych [ ]. W nawiasach najpierw pojawia się selektor wiersza, a potem selektor kolumny, rozdzielone przecinkiem. Tu właśnie wkracza do akcji wycinanie.

Na przykład:

  • matrix_c[1,2] wybiera element w pierwszym wierszu i drugiej kolumnie.
  • matrix_c[1:3,2:3] daje w wyniku macierz wycinków R z danymi w wierszach 1, 2, 3 oraz kolumnach 2 i 3.
  • matrix_c[,1] wybiera wszystkie elementy pierwszej kolumny.
  • matrix_c[1,] wybiera wszystkie elementy pierwszego wiersza.

Pozostawienie jednego boku przecinka pustego oznacza zatem, że wszystkie wartości po tej stronie pozostaną puste. Początkujący mogą się pogubić w jednej konsekwencji: po zaznaczeniu pojedynczego wiersza lub kolumny R pomija pusty wymiar i zwraca zwykły wektor. Dodanie drop = FALSE, jak w matrix_c[1, , drop = FALSE], powoduje, że wynik pozostaje macierzą.

Oto wynik uzyskany dla powyższych kodów

Wyniki konsoli czterech wyrażeń podziału macierzy w R

Nazwij wiersze i kolumny macierzy w R

Domyślne etykiety, takie jak [,1] i [3,], utrudniają odczytanie danych wyjściowych, gdy tylko macierz nabierze rzeczywistego znaczenia. Argument dimnames oraz funkcje zastępcze rownames() i colnames() dołączają etykiety tekstowe, które następnie są przesyłane wraz z macierzą przez cbind(), t() i każdą operację wycinania.

# Name the rows and columns while the matrix is built
sales <- matrix(1:6, nrow = 2, ncol = 3,
                dimnames = list(c('north', 'south'), c('q1', 'q2', 'q3')))

# Or attach the names afterwards
rownames(sales) <- c('north', 'south')
colnames(sales) <- c('q1', 'q2', 'q3')

# Read the names back as a list of two character vectors
dimnames(sales)

# Names make label based slicing possible
sales['north', 'q2']
Funkcjonować odczytuje Zestawy
dimnames(m) Oba wymiary jako lista dwóch wektorów dimnames(m) <- lista(wiersze, kolumny)
nazwy wierszy(m) Etykiety wierszy nazwy_wierszy(m) <- wiersze
nazwy kolumn(m) Etykiety kolumn nazwy kolumn(m) <- kolumny
przyciemniony(m) Wiersze i kolumny jako dwie liczby całkowite dim(m) <- c(nrow, ncol)

Po utworzeniu etykiet, sales['north', 'q2'] jest znacznie bardziej czytelne niż sales[1, 2] i przetrwa zmianę kolejności wierszy. Ustawienie komponentu dimnames na NULL powoduje ponowne usunięcie tego zestawu etykiet, a macierz przekonwertowana za pomocą as.data.frame() przenosi nazwy wierszy i kolumn bezpośrednio do ramka danych.

Matrix Operacje w R: arytmetyka, transpozycja i mnożenie

W arytmetyce macierzy sprawdza się zasada pojedynczego typu. Base R obsługuje cały zestaw bez dodatkowego pakietu, ale łatwo pomylić dwa operatory: * mnoży element przez element, podczas gdy %*% wykonuje prawdziwe mnożenie macierzy i wymaga, aby kolumny lewego operandu odpowiadały wierszom prawego operandu.

m1 <- matrix(1:4, nrow = 2)
m2 <- matrix(5:8, nrow = 2)

m1 + m2          # element by element addition
m1 * m2          # element by element product, NOT matrix multiplication
m1 %*% m2        # true matrix multiplication
t(m1)            # transpose: rows become columns
solve(m1)        # inverse, for a square matrix that is not singular

rowSums(m1)      # one total per row
colMeans(m1)     # one mean per column
apply(m1, 1, max)   # any function, applied row by row
  • t(m):Transponuje macierz, więc element [i, j] staje się [j, i]. Nazwy wymiarów są przenoszone.
  • rozwiązać(m): Zwraca odwrotność macierzy kwadratowej, nieosobliwej, a solve(a, b) rozwiązuje układ liniowy.
  • wiersze sum / kolumny sum / wiersze średnich / kolumny średnich: Udokumentowane jako równoważne apply() z sumą lub średnią, ale o wiele szybsze.
  • zastosuj(m, MARGINES, ZABAWA):MARGIN = 1 przegląda wiersze, a MARGIN = 2 przegląda kolumny, bez względu na podaną funkcję.
  • diagnostyka, det, crossprod: Przekątna, wyznacznik i szybsza forma t(x) %*% y.

Ponieważ operacje te są wektoryzowane, zastępują pętle, a nie tkwią w nich. Podsumowanie, które wymagałoby zagnieżdżonej pętli for obejmującej tysiące komórek, staje się pojedynczym wywołaniem colMeans(), co ma znaczenie, gdy tylko dane się rozrosną.

Macierz, ramka danych i tablica w R

Macierze, ramki danych i tablice wyglądają prostokątnie w konsoli, ale odpowiadają na różne pytania. Tabela ustawia je obok siebie.

Właściwość Matrix Ramka danych Szyk
Wymiary Dokładnie 2 Dokładnie 2 Jakikolwiek numer
Typy kolumn Jeden typ dla całego obiektu Inny typ na kolumnę Jeden typ dla całego obiektu
Zbudowany z matryca() data.frame() szyk()
Typowe zastosowanie Obliczenia numeryczne i algebra liniowa Mieszane dane obserwacyjne Tabele skumulowane, np. z liczbą według roku
Etykiety wierszy Opcjonalne nazwy wymiarów Nazwy wierszy zawsze obecne Opcjonalne nazwy wymiarów
# A matrix holds one type only, so mixing coerces everything to character
mixed <- matrix(c(1, 2, 'a', 'b'), nrow = 2)
class(mixed[1, 1])

# Convert between the structures
as.data.frame(matrix_c)
as.matrix(mtcars)

# A matrix is the two dimensional case of an array
is.matrix(matrix_c)
inherits(matrix_c, 'array')

Sięgnij po macierz, gdy każda komórka to ten sam rodzaj liczby, a obliczenia są arytmetyczne. Sięgnij po ramka danych gdy kolumny zawierają różne typy, na przykład nazwę znaku obok ceny numerycznej i czynnik. Sięgnij po podstęp gdy części mają różną długość, a w przypadku tablicy, gdy rzeczywiście istnieje trzeci indeks, taki jak czas lub region. Konwersja w obu kierunkach jest tania dzięki as.matrix() i as.data.frame(), więc struktura może podążać za zadaniem, a nie odwrotnie.

FAQ

R przetwarza wartości zamiast je odrzucać, więc macierz (1:3, nrow = 2, ncol = 3) powtarza sekwencję. Ostrzeżenie pojawia się tylko wtedy, gdy długość nie jest dokładną wielokrotnością liczby komórek, co sprawia, że ​​cichy recykling jest łatwym do przeoczenia błędem.

Użyj ujemnego indeksu: m[-2, ] usuwa drugi wiersz, a m[, -3] usuwa trzecią kolumnę. Można usunąć kilka naraz za pomocą m[-c(1, 4), ]. Oryginalny obiekt pozostaje niezmieniony, dopóki nie przypiszesz wyniku z powrotem.

Zaznaczenie pojedynczego wiersza lub kolumny domyślnie usuwa pusty wymiar. Dodaj drop = FALSE, jak w m[1, , drop = FALSE], aby zachować macierz jednowierszową. Ma to znaczenie, gdy wynik jest przekazywany do funkcji, która oczekuje dwóch wymiarów.

which(m == value, arr.ind = TRUE) zwraca wynik dwukolumnowy, podając wiersz i kolumnę każdego dopasowania. Bez arr.ind odpowiedzią jest pojedynczy indeks liniowy odliczany w dół kolumn, co rzadko jest pożądane.

Użyj funkcji array(data, dim = c(rows, columns, layers)) lub przypisz dim(x) bezpośrednio do wektora. Wycinek przyjmuje wtedy jeden indeks na wymiar, np. a[2, 3, 1]. Macierz to po prostu dwuwymiarowy przypadek tablicy.

Tak. W podstawowym dokumencie R stwierdzono, że rowSums i colMeans są równoważne apply() z sumą lub średnią, ale znacznie szybsze i oba przewyższają jawną pętlę for, ponieważ iteracja odbywa się w skompilowanym kodzie, a nie w interpreterze.

Dopasowanie modelu to algebra liniowa: cechy tworzą macierz, współczynniki tworzą wektor, a prognoza to pojedynczy iloczyn %*%. Wiele uczenie maszynowe Dlatego też pakiety wymagają jako danych wejściowych macierzy numerycznej, a nie ramki danych.

Tak. Drugi pilot GitHub Działa w RStudio 2023.09.0 i nowszych wersjach i uzupełnia kod na podstawie komentarzy w otwartym pliku. Sprawdź logikę wymiarowania w RStudio, ponieważ błędny wiersz nadal generuje prawidłową macierz.

Podsumuj ten post następująco: