子集仅包含日期的矩阵

时间:2017-10-12 12:30:55

标签: r date subset

我有一个矩阵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中使用lubridate包。

矩阵m的格式反映了原始日期矩阵的第一行的一部分,该矩阵本身具有dim = (96, 850)

EDIT1:为清晰起见编辑,&#34;开始&#34; &安培; &#34;端&#34;是Date类型,但未标记为此类。

2 个答案:

答案 0 :(得分:3)

最好将您的日期视为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)

答案 1 :(得分:1)

以下是使用seq生成开始和结束之间日期的基本R方法%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"

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

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