R中的性能问题:使用另一个字符向量增量矩阵值

时间:2016-07-14 11:03:32

标签: r performance matrix indexing which

我想做什么: 给定字符向量"b"会增加矩阵"a"中的每个单元格,对应于从b[i]b[i+1]的转换

a <- matrix(1:676,nrow=26,ncol=26)
tags <- sample(letters)
colnames(a) <- tags
rownames(a) <- tags

b <- c("a","k","l","c","a","k")

我预计会发生以下变化:

a[b[1],b[2]] <- a[b[1],b[2]]+1
a[b[2],b[3]] <- a[b[2],b[3]]+1
a[b[3],b[4]] <- a[b[3],b[4]]+1
a[b[4],b[5]] <- a[b[4],b[5]]+1
a[b[5],b[6]] <- a[b[5],b[6]]+1

请注意从&#34; a&#34;到&#34; k&#34;发生两次意味着a中相应的矩阵单元应该递增两次

显然,我正在处理一个更大的问题,我无法使用上述方法增加这些单元格。另外,出于性能原因,我想避免任何涉及循环的解决方案。

如果我处理数字而不是字符,我会做以下事情:

  mylength <- length(b)
   b_ind <- nrow(a) * (as.numeric(b[2:mylength]) - 1) + as.numeric(b[1:(mylength-1)])
  a[b_ind] <- a[b_ind] + 1

但是,我正在处理字符,这意味着像b[2:mylength]) - 1这样的因素会呈现不正确的值

我正在考虑使用"which()"函数解决上一个问题,如下所示:

which(rownames(a) %in% b[2:length(b)])

但是,这会以无序的方式提供索引。另外,我不确定使用哪个是性能最好的选择

2 个答案:

答案 0 :(得分:2)

我们可以尝试

i1 <- cbind(match(b[-length(b)], rownames(a)), match(b[-1], colnames(a)))
res <- a
res[i1] <- res[i1]+1

与OP的方法比较

a[b[1],b[2]] <- a[b[1],b[2]]+1
a[b[2],b[3]] <- a[b[2],b[3]]+1
a[b[3],b[4]] <- a[b[3],b[4]]+1
identical(res, a)
#[1] TRUE

答案 1 :(得分:2)

a <- matrix(0,nrow=26,ncol=26)
tags <- sample(letters)
colnames(a) <- tags
rownames(a) <- tags

b <- c("a","k","l","c","a","k")

i = match(b[-length(b)], rownames(a)) + (match(b[-1], colnames(a)) - 1)*nrow(a)
tab <- table(i)
mynames <- as.integer(names(tab))
a[mynames] <- a[mynames] + tab

归功于akrun和alexis_laz