حدد القيم من المتجه باستخدام التاريخ كفهرس

StackOverflow https://stackoverflow.com/questions/2736631

  •  02-10-2019
  •  | 
  •  

سؤال

لنفترض أن لدي ناقل اسمه ، 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top