حدد القيم من المتجه باستخدام التاريخ كفهرس
سؤال
لنفترض أن لدي ناقل اسمه ، bar
:
bar=c()
bar["1997-10-14"]=1
bar["2001-10-14"]=2
bar["2007-10-14"]=1
كيف يمكنني الاختيار من bar
جميع القيم التي يكون الفهرس ضمن نطاق تاريخ محدد؟ لذا ، إذا بحثت عن كل القيم بين "1995-01-01"
و "2000-06-01"
, ، ينبغي أن أحصل على 1
. وبالمثل للفترة بين "2001-09-01"
و "2007-11-04"
, ، ينبغي أن أحصل على 2
و 1
.
المحلول
تم حل هذه المشكلة إلى الأبد مع XTS الحزمة التي تمتد وظائف من حديقة حيوان حزمة.
R> library(xts)
Loading required package: zoo
R> bar <- xts(1:3, order.by=as.Date("2001-01-01")+365*0:2)
R> bar
[,1]
2001-01-01 1
2002-01-01 2
2003-01-01 3
R> bar["2002::"] ## open range with a start year
[,1]
2002-01-01 2
2003-01-01 3
R> bar["::2002"] ## or end year
[,1]
2001-01-01 1
2002-01-01 2
R> bar["2002-01-01"] ## or hits a particular date
[,1]
2002-01-01 2
R>
هناك الكثير هنا - لكن النقطة الأساسية هي القيام بذلك ليس تعمل على الأوتار تتنكر كتواريخ.
إستخدم Date
اكتب ، أو ويفضل حتى حزمة تمديد تم إنشاؤها لفهرس بكفاءة على ملايين التواريخ.
نصائح أخرى
تحتاج إلى تحويل تواريخك من الأحرف إلى Date
اكتب مع as.Date()
(أو نوع posix إذا كان لديك المزيد من المعلومات مثل الوقت من اليوم). ثم يمكنك إجراء مقارنات مع المعيار العوامل العلاقية مثل <= و> =.
يجب أن تفكر في استخدام حزمة الزمن مثل zoo
لهذا.
يحرر:
فقط للرد على تعليقك ، إليك مثال على استخدام التواريخ مع متجهك الحالي:
> as.Date(names(bar)) < as.Date("2001-10-14")
[1] TRUE FALSE FALSE
> bar[as.Date(names(bar)) < as.Date("2001-10-14")]
1997-10-14
1
على الرغم من أنه يجب عليك حقًا استخدام حزمة سلسلة زمنية. إليك كيف يمكنك القيام بذلك zoo
(أو xts
, timeSeries
, fts
, ، إلخ.):
library(zoo)
ts <- zoo(c(1, 2, 1), as.Date(c("1997-10-14", "2001-10-14", "2007-10-14")))
ts[index(ts) < as.Date("2001-10-14"),]
لأن الفهرس الآن أ Date
اكتب ، يمكنك إجراء العديد من المقارنات كما تريد. إقرأ ال zoo
المقالة القصيرة لمزيد من المعلومات.
باستخدام حقيقة أن التواريخ بترتيب معجمي:
bar[names(bar) > "1995-01-01" & names(bar) < "2000-06-01"]
# 1997-10-14
# 1
bar[names(bar) > "2001-09-01" & names(bar) < "2007-11-04"]
# 2001-10-14 2007-10-14
# 2 1
النتيجة تدعى المتجه (كما أنت أصلي bar
, ، إنها ليست قائمة تدعى المتجه).
كما يقول ديرك في إجابته ، من الأفضل استخدامها Date
لأسباب الكفاءة. بدون حزم خارجية ، يمكنك إعادة ترتيب البيانات وإنشاء متجهين (أو عمودان data.frame
) واحد للتواريخ ، واحد للقيم:
bar_dates <- as.Date(c("1997-10-14", "2001-10-14", "2007-10-14"))
bar_values <- c(1,2,1)
ثم استخدم فهرسة بسيطة:
bar_values[bar_dates > as.Date("1995-01-01") & bar_dates < as.Date("2000-06-01")]
# [1] 1
bar_values[bar_dates > as.Date("2001-09-01") & bar_dates < as.Date("2007-11-04")]
# [1] 2 1