R使用查找来替换矩阵中的值

时间:2014-07-28 09:01:30

标签: r loops matrix vector sapply

假设我有一个矩阵(日期是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或类似的东西来做到这一点?

1 个答案:

答案 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