我有一个布尔矩阵,我希望迭代另一个矩阵的行,每行返回列的内容,其索引对应于布尔矩阵中包含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
有任何明显的危险信号吗?一种更简单,更好的方法?
答案 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)
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