【问题标题】:Subset a matrix containing only Dates对仅包含日期的矩阵进行子集
【发布时间】:2024-01-19 15:33:01
【问题描述】:

我得到了一个矩阵 m,如下所示:

df <- c("2011-01-02", "2011-01-05", "2011-01-08", "2011-01-11", "2011-01-14", 
"2011-01-17", "2011-01-20", "2011-01-23", "2011-01-26", "2011-01-29", 
"2011-02-01", "2011-02-04", "2011-02-07", "2011-02-10", "2011-02-13") 

m <- matrix(nrow = 1, ncol = 15, byrow = T, data = df)

矩阵中的条目是Date 类对象。

我有一个间隔:

start <- as.Date("2011-01-26")
end <- as.Date("2011-02-10")

现在我想选择矩阵 m 中属于这个区间的所有日期(例如 cols 9 到 14)并将它们输出到一个新矩阵中。我无法执行此选择,非常感谢任何输入!我在 R 中使用 lubridatepackage。

矩阵 m 的格式反映了我原来的 Dates 矩阵第一行的一部分,它本身有 dim = (96, 850)

EDIT1:为清楚起见进行了编辑,“开始”和“结束”是 Date 类型,但没有这样标记。

【问题讨论】:

    标签: r date subset


    【解决方案1】:

    最好将您的日期视为Date

    # convert to Dates
    m <- as.Date(m)
    start <- as.Date(start)
    end <- as.Date(end)
    

    使用dplyr::between 过滤您的数据

    require(dplyr)
    ans <- m[dplyr::between(m, start, end)]  # m >= start && m <= end
    # [1] "2011-01-26" "2011-01-29" "2011-02-01" "2011-02-04" "2011-02-07"
    # [6] "2011-02-10"
    

    这会输出一个向量。

    对于矩阵输出,试试这样的

    n <- m
    n[!dplyr::between(n, start, end)] <- NA
    newm <- matrix(nrow=1, ncol=15, byrow=T, data=n)
    

    【讨论】:

    • 谢谢。不幸的是,将我的原始矩阵 m(有 96 行和 850 列)转换为 Date 类是不可能的,因为它不会保留矩阵的结构。我可以为每一行尝试这个,然后循环遍历它......
    【解决方案2】:

    这是一个基本 R 方法,使用 seq 生成开始和结束之间的日期和%in%

    m[m %in% as.character(seq(as.Date(start), as.Date(end), by="day"))]
    [1] "2011-01-26" "2011-01-29" "2011-02-01" "2011-02-04" "2011-02-07" "2011-02-10"
    

    需要注意的一点是,日期是 R 中的一个类,矩阵也是。将日期作为 Date 对象存储在矩阵中是非常困难的(可能并非不可能)。而是将上述内容存储为字符。

    此解决方案使用as.Date 将开始和结束转换为日期,然后使用seq 生成从开始到结束的每日日期向量。然后将它们转换为字符,并使用%in% 比较 m 中的元素。最后,[ 用于提取所需的元素。

    【讨论】: