R中的矩阵引用,指向量查找

时间:2014-07-25 14:47:00

标签: r matrix vector conditional

仅供参考我已经简化了实际问题

说我有一个矩阵,即 日期和列/行名称

    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

我有一个参考日期,我想要提取所有大于或等于此参考日期的数据。即如果参考日期是2012-08-13,那么我想要这些数据:

    2012-08-06  2012-08-13  2012-08-20  2012-08-27
2012-08-06              
2012-08-13      1.0 1.0 1.0
2012-08-20      1.0     
2012-08-27      1.0 

我实际上是通过单独执行行和列来实现此目的,并且对我来说效果很好 即使用逻辑 数据[rownames(data)<引用,colnames(data)== reference]获取列和类似的东西来获取行

然而,我想要的是参考查询(所以不只是多个日期的一个值,即如果我有两个日期

reference = c("2012-08-13","2012-08-20")

然后我需要获取的值必须是:

    2012-08-06  2012-08-13  2012-08-20  2012-08-27
2012-08-06              
2012-08-13      1.0 1.0 1.0
2012-08-20      1.0 1.0 1.0
2012-08-27      1.0 1.0 

我想最终用符合此条件的其他内容替换1.0&#c>

有人可以帮我将行/列名称引用到查找向量中吗? 我的最终目标是实际使用我保留为1.0的行/列来将这些数字替换为其他计算字段(在原始矩阵中)

由于

1 个答案:

答案 0 :(得分:1)

这是一个很好的选择。其思想是对每个参考执行操作,用NA替换不需要的行和列(即参考之前的那些)。这就是f的作用。然后,使用函数g组合为每个参考获得的数据帧。

d <- structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), .Dim = c(4L, 
    4L), .Dimnames = list(c("2012-08-06", "2012-08-13", "2012-08-20", 
    "2012-08-27"), c("2012-08-06", "2012-08-13", "2012-08-20", "2012-08-27"
    )))

f <- function(d, ref) {
    d[-which(rownames(d) == ref), -which(colnames(d) == ref)] <- NA
    d
}    

g <- function(d1, d2) {
    d1[is.na(d1) & !is.na(d2)] <- 1
    d1
}

refs <- sort(c("2012-08-13",  "2012-08-20")) # must be sorted
dlist <- lapply(refs, f, d = d)
res <- Reduce(g, dlist)
res[rownames(res) < min(refs), ] <- NA
res[, colnames(res) < min(refs)] <- NA
res
#            2012-08-06 2012-08-13 2012-08-20 2012-08-27
# 2012-08-06         NA         NA         NA         NA
# 2012-08-13         NA          1          1          1
# 2012-08-20         NA          1          1          1
# 2012-08-27         NA          1          1         NA