如果你改變你存儲的變量更新的方法這個問題可以被簡化了不少,如:
dat <- structure(c(1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(6L, 6L),
.Dimnames = list(c("A", "B", "C", "D", "E", "F"), c("P1","P2", "P3", "P4", "P5", "P6")))
將您的升級記錄在data.frame
中。將相關項目存儲在單個對象(如list
或data.frame
)中有幾個優點,如果您發現需要對所有項目應用通用更改,則可以避免在多個項目上處理複雜循環的需要。
upg <- mget(ls(pattern="_upgrade"))
names(upg) <- gsub("_upgrade","",names(upg))
upg <- data.frame(
row=unlist(upg),
col=rep(names(upg),sapply(upg,length)),
count=1,
stringsAsFactors=FALSE
)
# row col count
#P1 E P1 1
#P3 C P3 1
#P51 D P5 1
#P52 D P5 1
#P53 F P5 1
aggregate
升級的行/列索引:
upg <- aggregate(count ~ row + col , data=upg, sum)
# row col count
#1 E P1 1
#2 C P3 1
#3 D P5 2
#4 F P5 1
添加升級值(雖然你將需要改變dat
到matrix
第一這個工作):
dat <- as.matrix(dat)
dat[ as.matrix(upg[1:2]) ] <- (dat[ as.matrix(upg[1:2]) ] + upg$count)
# P1 P2 P3 P4 P5 P6
#A 1 0 0 0 0 0
#B 0 1 0 0 0 0
#C 0 0 2 0 0 1
#D 0 0 0 0 3 0
#E 2 0 0 0 0 0
#F 0 0 0 1 2 0
如果數據框中的每一列都是相同的類型(在這種情況下總是數字),那麼使用矩陣就更好了,正如Як在他的回答中所表明的那樣。 –