假设我有一个矩阵(日期是col和行名称)
B=matrix(rep(1,16),ncol=4,nrow=4)
rownames(B) = c("2012-08-06","2012-08-13","2012-08-20","2012-08-27")
colnames(B) = c("2012-08-06","2012-08-13","2012-08-20","2012-08-27")
2012-08-06 2012-08-13 2012-08-20 2012-08-27
2012-08-06 1.0 1.0 1.0 1.0
2012-08-13 1.0 1.0 1.0 1.0
2012-08-20 1.0 1.0 1.0 1.0
2012-08-27 1.0 1.0 1.0 1.0
和查找:
lookup = c("2012-08-13","2012-08-20")
现在我有循环查看每个查找值,并替换矩阵中具有该日期的colname或行名称的数字 即我有一些逻辑,取每个查找值 并且矢量替换 即vector [somelogic,somelogic] =新值 这是一个简化的例子:
for(i in lookup){
B[rownames(B) < i, colnames(B) > i] = 2
B[rownames(B) > i, colnames(B) == i] = 5
}
有没有办法用sapply或类似的东西来做到这一点?
答案 0 :(得分:0)
如果循环按预期工作,则不确定为什么需要sapply
解决方案。
转换为date
rB <- as.Date(rownames(B))
cB <- as.Date(colnames(B))
lookup <- as.Date(lookup)
lst1 <- lapply(lookup, function(i) {
B[rB < i, cB > i] <- 2
B[rB > i, cB == i] <- 5
B
})
Reduce(function(x,y) ifelse(x!=1 & y==1, x,y), lst1)
# 2012-08-06 2012-08-13 2012-08-20 2012-08-27
# 2012-08-06 1 1 2 2
# 2012-08-13 1 1 1 2
# 2012-08-20 1 5 1 1
# 2012-08-27 1 5 5 1