用另一个矩阵子集一个矩阵

时间:2018-04-06 20:54:14

标签: r apply

我有一个布尔矩阵,我希望迭代另一个矩阵的行,每行返回列的内容,其索引对应于布尔矩阵中包含TRUE的列。到目前为止,这是我的解决方案......

示例

set.seed(0)
knl <- c(FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE)
A = matrix(knl, nrow=3, ncol=6, byrow=TRUE)
B = matrix(rnorm(18),3,6)

fn <- function(x, vec) {return(x[,vec])}
v = unlist(apply(A, 1, which)))
mapply(fn, x=as.data.frame(t(B)), vec=v)

所需输出

不确定如何格式化,但不是这样的。

# [1,]
# -1.1476570
# -0.2894616
# -0.2992151
# [2,]
# 1.2724293
# 0.4146414
# -1.5399500
# [3,]
# 1.2724293
# 0.4146414
# -1.5399500

但不知何故弄乱了尺寸,无法想出这个。

Error in x[, vec] : incorrect number of dimensions

有任何明显的危险信号吗?一种更简单,更好的方法?

3 个答案:

答案 0 :(得分:1)

您可以首先在A的每一行中提取TRUE列,然后对于每个列,从B中提取该列

lapply(apply(A, 1, which), function(i) B[,i,drop=FALSE])

答案 1 :(得分:0)

如果要使用NA填充不匹配的行,则不指定:

set.seed(0)
knl <- c(FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE)
A = matrix(knl, nrow=3, ncol=3, byrow=TRUE)
B = matrix(rnorm(9),3,3) 
t(B[,apply(A,1,function(x) ifelse(is.null(which(x)),NA,which(x)))])

/ MN

答案 2 :(得分:0)

在这种情况下,基于{p> AggregateException.GetBaseException()的解决方案值得考虑。逻辑迭代所有行的索引(1到max-row)。对于包含mapply的行中的每个元素,都会返回TRUE中的列。它可以建立为B

B[,A[x,]]

数据

mapply(function(x)B[,A[x,]], 1:nrow(B))
#            [,1]       [,2]       [,3]
# [1,] -1.1476570  1.2724293  1.2724293
# [2,] -0.2894616  0.4146414  0.4146414
# [3,] -0.2992151 -1.5399500 -1.5399500