子集R矩阵的列取决于特定条目

时间:2017-01-11 17:08:52

标签: r matrix subset

好像这个问题应该被多次询问,但是我没有成功地搜索Questions that may already have your answer

如何使用布尔运算符(不使用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>

2 个答案:

答案 0 :(得分:2)

您可以使用apply调用来搜索列元素并对其进行索引。

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

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

注意 - 您会注意到drop = FALSE参数存在。这是为了确保在只有1列的情况下输出仍然是矩阵。

答案 1 :(得分:1)

这是另一种选择。

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

m==D构造一个逻辑矩阵,然后colSums计算TRUE的数量。接下来,检查这些是否大于0.检查的结果用于矩阵的子集。按照@ cdeterman的回答,我添加了drop = FALSE来保留矩阵结构。