2017-01-11 44 views
0

似乎應該問這個問題一堆,但我正在搜索Questions that may already have your answer沒有成功。在特定條目上設置R矩陣的子列

你如何用布爾運算符子集(不使用subset())矩陣的列?

> m = matrix(c("A", "B", "B", "B", "C", "A", "C", "C", "D"), nrow = 3) 
> m 
    [,1] [,2] [,3] 
[1,] "A" "B" "C" 
[2,] "B" "C" "C" 
[3,] "B" "A" "D" 

注意,列沒有名字,我想包含在某些條目中的值「d」任何列。

例如,在this post,呼叫grades[grades[,"pass"] == 2,]。除了調用提取行的事實以及pass引用單個列的事實之外,列沒有名稱。

我曾嘗試:

> m[m == "D", ] 
Error in m[m == "D", ] : (subscript) logical subscript too long 

> m[which(m=="D"), ] 
Error in m[which(m == "D"), ] : subscript out of bounds 

> m = as.data.frame(m) # Turning the matrix into a df 
> m[m == "D", ] 
    V1 V2 V3 
NA <NA> <NA> <NA> 

回答

1

以下是另一種選擇。

m[, colSums(m == "D") > 0, drop=FALSE] 
    [,1] 
[1,] "C" 
[2,] "C" 
[3,] "D" 

m==D構建一個邏輯矩陣,則colSums計數TRUEs的數量。接下來,檢查這些是否大於0.檢查的結果用於矩陣的子集。在@ cdeterman的回答之後,我添加了drop = FALSE來保留矩陣結構。

+0

真高雅!謝謝! – Toni

2

您可以使用apply呼叫搜索的列元素和索引這些。

m[,apply(m, MARGIN = 2, function(x) any(x == "D")), drop = FALSE] 

    [,1] 
[1,] "C" 
[2,] "C" 
[3,] "D" 

注 - 您會注意到drop = FALSE參數存在。這是爲了確保在只有1列的情況下輸出仍然是矩陣。

+0

謝謝。這是對它進行子集化的一種痛苦方式。請不要將此誤解爲批評,因爲您可能很正確 - R並非特別容易...... MARGIN = 2'引入了我們想要列的概念? – Toni

+0

正確,'MARGIN'表示是否在行或列上。你可以在文檔中看到這個。 – cdeterman

+0

@Toni,如果這符合你的問題,請務必接受這個答案。 – cdeterman