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.
Author: Jaap, 2011-03-22

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.

 125
Author: neilfws,
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.

 21
Author: John,
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)
 15
Author: mavez DABAS,
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, ]
 5
Author: juba,
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 called Mat 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.

 5
Author: Mohamad Elmasri,
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