سؤال

ماذا لو كنت تريد تطبيق وظيفة بخلاف format إلى قائمة كائنات posixct؟ على سبيل المثال ، قل أنني أريد أن آخذ متجهًا من الأوقات ، وقم باقتخص تلك الأوقات إلى الساعة ، وتطبيق وظيفة تعسفية على كل واحدة من تلك الأوقات.

> obs.times=as.POSIXct(c('2010-01-02 12:37:45','2010-01-02 08:45:45','2010-01-09 14:45:53'))
> obs.truncated=trunc(obs.times, units="hours")
> obs.truncated
[1] "2010-01-02 12:00:00 EST" "2010-01-02 08:00:00 EST"
[3] "2010-01-09 14:00:00 EST"

الآن ، أتوقع طول obs.truncated ليكون 3 ولكن

> length(obs.truncated)
[1] 9

لذلك يمكنك أن ترى ذلك محاولة apply وظيفة لهذا المتجه لن تعمل. فئة obs.truncated هو

> class(obs.truncated)
[1] "POSIXt"  "POSIXlt"

هل لديكم فكرة عما يحدث هنا؟؟ apply و length يبدو أنه يأخذ العنصر الأول من المتجه كقائمة خاصة به.

هل كانت مفيدة؟

المحلول

ال length() من مثل هذا posixlt اعتاد الإبلاغ عن تسعة ، ولكن تم تصحيح ذلك مؤخرًا.

أيضا ، عندما أفعل trunc(obs.times) يحدث الشيء الخطأ - trunc() يعمل مرة واحدة فقط على سلسلة من ثلاثة عناصر. أنت بحاجة apply() وآخرون.

لذا ، إليك مثال على استخدام sapply() مع إعادة ضبط المكون:

> sapply(obs.times, function(.) {
+ p <- as.POSIXlt(.); 
+ p$min <- p$sec <- 0; 
+ format(p) })
[1] "2010-01-02 12:00:00" "2010-01-02 08:00:00" "2010-01-09 14:00:00"
> 

بينما

> trunc(obs.times, units="hours")
[1] "2010-01-02 12:00:00 CST" "2010-01-02 08:00:00 CST"
[3] "2010-01-09 14:00:00 CST"
> class(trunc(obs.times, units="hours"))
[1] "POSIXt"  "POSIXlt"
> length(trunc(obs.times, units="hours"))
[1] 1
> 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top