【发布时间】:2014-11-20 23:46:46
【问题描述】:
假设一个由 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 个数字的字符串)并将最后一列的相应值存储在单独的向量中。
目前我正在使用以下代码:
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
}
对于较大的目标向量(即 permutations 中较大的 r),我的代码需要很长时间才能运行。
有什么方法可以更有效地做到这一点?
【问题讨论】:
-
也许你可以制作一个更小的“垫子”供人们试用他们的代码,而不是当前的 32768*16 野兽。干杯。
-
好的,我换了个更小的。只是想用较大的来说明需要多长时间。
-
你能假设
mat包含所有长度为r的位串吗?如果是这样,您可以明确地找到最近的邻居,而无需每次都遍历整个数组。 -
是的,mat 总是包含所有可能的组合。所以你建议的解决方案会很棒!