好像这个问题应该被多次询问,但是我没有成功地搜索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>
答案 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来保留矩阵结构。