Jak podzielić macierz na jedną kolumnę, zachować typ danych macierzy, zachować nazwy wierszy / kolumn?

84

Kiedy podzbiorę macierz na pojedynczą kolumnę, wynik jest klasy numerycznej, a nie macierzy (tj. MyMatrix [, 5] do podzbioru w piątej kolumnie). Czy istnieje kompaktowy sposób na podzbiór do pojedynczej kolumny, zachowanie formatu macierzy i zachowanie nazw wierszy / kolumn bez robienia czegoś skomplikowanego, takiego jak:

matrix( myMatrix[ , 5 ] , dimnames = list( rownames( myMatrix ) , colnames( myMatrix )[ 5 ] )
SFun28
źródło

Odpowiedzi:

122

Użyj drop=FALSEargumentu do [.

m <- matrix(1:10,5,2)
rownames(m) <- 1:5
colnames(m) <- 1:2
m[,1]             # vector
m[,1,drop=FALSE]  # matrix
Joshua Ulrich
źródło
Przysiągłbym, że widziałem to niedawno, ale mogło to być analogiczne zachowanie ramki danych, które było kwestionowane: stackoverflow.com/questions/6941985/ ...
IRTFM
5
Jeśli chcesz indeksować tylko według pierwszego wymiaru, możesz użyć kropli w następujący sposób:m[1,,drop=FALSE]
Kevin Bullaughey
Aby podać przykład ze względów statystycznych, używając odległości Cooksa D, a następnie wybierając wartości na podstawie wartości odcięcia, np. 0,1, da to wartości CooksD wraz z odpowiednią liczbą wierszy we względnym zbiorze danych cooksd<-as.data.frame(cooks.distance(ft1)) cooksD_outliers<-cooksd[cooksd>0.1,drop=FALSE,]
Elias Estatistics EU
wynik <-apply (temp, 1, function (x) tapply (x, genesymbol, function (x) mean (x, na.rm = T))) Jak sobie poradzić z problemem wynik jest tablicą, ale w rzeczywistości Chcę, aby była to ramka danych z jedną kolumną? Dzięki
Shicheng Guo
@ShichengGuo: Powinieneś zadać nowe pytanie.
Joshua Ulrich