Wybierz wiersze macierzy, które spełniają warunek
W R z macierzą:
one two three four
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 11 18
[4,] 4 9 11 19
[5,] 5 10 15 20
Chcę wyodrębnić submatrix, którego wiersze mają kolumnę trzy = 11. Czyli:
one two three four
[1,] 1 6 11 16
[3,] 3 8 11 18
[4,] 4 9 11 19
Chcę to zrobić bez zapętlania. Jestem nowy w R więc jest to prawdopodobnie bardzo oczywiste, ale
dokumentacja jest często nieco zwięzła. 5 answers
Jest to łatwiejsze do zrobienia, jeśli przekonwertujesz swoją matrycę na ramkę danych za pomocą as.data.frame (). W takim przypadku poprzednie odpowiedzi (używając podzestawu lub m$trzy) będą działać, w przeciwnym razie nie będą.
Aby wykonać operację na macierzy , można zdefiniować kolumnę po nazwie:
m[m[, "three"] == 11,]
Lub według numeru:
m[m[,3] == 11,]
Zauważ, że jeśli tylko jeden wiersz pasuje, wynikiem jest wektor całkowity, a nie macierz.
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-22 13:09:46
m <- matrix(1:20, ncol = 4)
colnames(m) <- letters[1:4]
Następujące polecenie wybierze pierwszy wiersz powyższej macierzy.
subset(m, m[,4] == 16)
I to wybierze trzy ostatnie.
subset(m, m[,4] > 17)
Wynikiem będzie macierz w obu przypadkach. Jeśli chcesz użyć nazw kolumn do wybierania kolumn, najlepiej będzie przekształcić je w ramkę danych za pomocą
mf <- data.frame(m)
Następnie możesz wybrać za pomocą
mf[ mf$a == 16, ]
Lub, można użyć polecenia podzbiór.
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
2015-01-12 04:25:31
Wybieram proste podejście przy użyciu pakietu dplyr.
Jeśli ramka danych jest danymi.
library(dplyr)
result <- filter(data, three == 11)
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
2018-09-12 18:06:51
Jeśli macierz nazywa się m
, Wystarczy użyć :
R> m[m$three == 11, ]
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-22 12:26:12
Podzbiór jest funkcją bardzo powolną i osobiście uważam ją za bezużyteczną.
Zakładam, że masz dane.frame, array, matrix calledMat
with A
, B
, C
jako nazwy kolumn; wtedy wystarczy:
-
W przypadku jednego warunku na jednej kolumnie, powiedzmy kolumna a
Mat[which(Mat[,'A'] == 10), ]
W przypadku wielu warunków na różnych kolumnach, można utworzyć zmienną obojętną. Załóżmy, że warunki są A = 10
, B = 5
, i C > 2
, wtedy my mieć:
aux = which(Mat[,'A'] == 10)
aux = aux[which(Mat[aux,'B'] == 5)]
aux = aux[which(Mat[aux,'C'] > 2)]
Mat[aux, ]
Testując przewagę prędkości za pomocą metody system.time
, metoda which
jest 10x szybsza niż metoda subset
.
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
2012-10-01 22:41:21