我有一个矩阵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
类型,但未标记为此类。
答案 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中的元素。最后,[
用于提取所需的元素。