我想做什么:
给定字符向量"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)])
但是,这会以无序的方式提供索引。另外,我不确定使用哪个是性能最好的选择
答案 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