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ć podmacierz, której wiersze mają kolumnę trzecią = 11. To jest:
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.
[ ]
w odpowiedziach, a zobaczysz to wyraźniej.Odpowiedzi:
Jest to łatwiejsze do zrobienia, jeśli przekonwertujesz macierz na ramkę danych za pomocą metody as.data.frame (). W takim przypadku poprzednie odpowiedzi (używając podzbioru lub m $ trzy) będą działać, w przeciwnym razie nie.
Aby wykonać operację na macierzy , możesz zdefiniować kolumnę według nazwy:
Lub według numeru:
Zauważ, że jeśli pasuje tylko jeden wiersz, wynikiem jest wektor całkowity, a nie macierz.
źródło
m[m[,3] == 11,,drop=FALSE]
df <- df[!which(df$ARID3A:df$YY1 == "U"),]
, tutaj chcę usunąć te wiersze z mojego df gdzie szereg kolumn (ARID3A: YY1) zawiera wartość U .Następujące polecenie wybierze pierwszy wiersz powyższej macierzy.
A to spowoduje wybranie trzech ostatnich.
Wynik będzie macierzą w obu przypadkach. Jeśli chcesz używać nazw kolumn do wybierania kolumn, najlepiej byłoby przekonwertować je na ramkę danych z
Następnie możesz wybrać za pomocą
Lub możesz użyć polecenia podzestaw.
źródło
Wybiorę proste podejście z wykorzystaniem pakietu dplyr.
Jeśli ramka danych to data.
źródło
Podzbiór to bardzo powolna funkcja i osobiście uważam ją za bezużyteczną.
Zakładam, że masz data.frame, tablicę, zwaną matrycę
Mat
zA
,B
,C
jako nazwy kolumn; wtedy wszystko, co musisz zrobić, to:W przypadku jednego warunku w jednej kolumnie, powiedzmy kolumnę A
W przypadku wielu warunków w różnych kolumnach można utworzyć zmienną zastępczą. Załóżmy, że warunki są
A = 10
,B = 5
iC > 2
to mamy:Testując przewagę szybkości za pomocą
system.time
,which
metoda jest 10x szybsza niżsubset
metoda.źródło
Jeśli twoja macierz jest wywołana
m
, po prostu użyj:źródło
df <- df[!which(df$ARID3A:df$YY1 == "U"),]
tutaj chcę usunąć te wiersze z mojego df, w których zakres kolumn (ARID3A: YY1) zawiera wartośćU
Jeśli zbiór danych nazywa się danymi, wszystkie wiersze spełniające warunek, w którym wartość kolumny „pm2,5”> 300, mogą zostać odebrane przez -
data [data ['pm2,5']> 300,]
źródło