假设一个0和1的矩阵:
library(gtools)
mat<-permutations(n = 2, r = 5, v = c(0,1), repeats.allowed = TRUE)
mat<-cbind(mat, round(runif(nrow(mat)), digits = 2))
我想浏览mat
的每一行,并确定其1位数的最近邻居(即只有1个数字相差的所有字符串),并将最后一列的相应值存储在单独的向量中。 / p>
目前我正在使用以下代码:
results <- matrix(NA, ncol = 6, nrow = nrow(mat))
N = ncol(mat)-1
for ( i in 1:nrow(mat)){ #for each row in the matrix
a <- as.vector(mat[i, 1:N]) #select a single row
res <- sapply(1:nrow(mat), function(x) mat[x, 1:N] == a) #cound how many elements match each row
results[i, ]<-c(mat[colSums(res) == N-1, N+1], mat[i, N+1]) #identify those rows that differ max 1 digit and store the value in the last column
}
对于较大的目标向量(即r
中较大的permutations
),我的代码需要花费很长时间才能运行。
有没有办法更有效地做到这一点?
答案 0 :(得分:2)
假设mat
包含长度为r
的所有位字符串且按顺序排列,如示例中所示(如果未排序,则可对其进行排序),然后您可以计算明确没有遍历整个数组的邻居的索引。例如:
m0<-mat[,-ncol(mat)]
bitflips<-diag(ncol(m0))
powers<-2^(ncol(m0):1-1)
neighbors<-t(apply(m0,1,function(x) {sort((powers %*% ((x + bitflips) %% 2)) +1)}))
results<-mat
results[,-ncol(mat)]<-results[neighbors,ncol(mat)]