【问题标题】:R using a lookup to replace values in a matrixR使用查找替换矩阵中的值
【发布时间】:2014-09-19 10:23:05
【问题描述】:

假设我有一个矩阵(日期是列名和行名)

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")

现在我有一个循环来查看每个查找值,并替换矩阵中具有该日期的列名或行名的数字 即我有一些逻辑可以获取每个查找值 并做一个向量替换 即向量 [somelogic,somelogic] = 新值 这是一个简化的例子:

for(i in lookup){
B[rownames(B) < i, colnames(B) > i] = 2
B[rownames(B) > i, colnames(B) == i] = 5
}

有没有办法用 sapply 或类似的东西来做到这一点?

【问题讨论】:

  • 您能否提供您当前正在使用的循环,或者至少提供示例数据所需的输出?
  • 我已经添加了示例
  • 您的示例仍然不完整,因为您不能在字符串上使用&lt;&gt;,并且循环的每次迭代都做同样的事情。我想您正在寻找涉及which(rownames(b) == lookup[i]) 等的内容,但目前的信息尚不清楚。
  • 它适用于我的,但很高兴它被转换为.Date

标签: r loops matrix vector sapply


【解决方案1】:

如果循环按预期工作,不确定为什么需要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

【讨论】:

  • 您好,您的输出创建了一个新对象,但我想替换矩阵 B 中的值
  • @shecode。我认为使用for() 循环可以更好地解决这类问题。
  • 我已经通过 for() 循环解决了这个问题。它太慢了。这是我的担心
猜你喜欢
  • 2021-02-19
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多