التلاعب التاريخ باستخدام أس.بوسيكسلت
سؤال
أحاول تحديد موقع أقرب يوم أحد إلى اليوم.
أعرف اليوم على أنه:
dt <- as.Date("2014-06-04")
يمكنني العثور على يوم الأحد الماضي باتباع:
dt - as.POSIXlt(dt)$wday
[1] "2014-06-01"
يمكنني العثور على يوم الأحد المقبل باتباع:
dt + as.POSIXlt(dt)$wday
[1] "2014-06-07"
لست متأكدا لماذا لا يعمل ما يلي:
ifelse(as.POSIXlt(dt)$wday <= 3,
dt - as.POSIXlt(dt)$wday,
dt + as.POSIXlt(dt)$wday)
[1] 16222
أنا أحصل على رقم: 16222
بدلا من التاريخ.
كل من العبارات التالية تعمل كما هو متوقع:
as.POSIXlt(dt)$wday
class(as.POSIXlt(dt)$wday)
as.POSIXlt(dt)$wday <= 3
أي أفكار??
المحلول
يبدو أن ifelse
إرجاع ناقلات وشرائط فئة" بوسيكس " من التواريخ الخاصة بك.لماذا لا تفعل
dt + ifelse(as.POSIXlt(dt)$wday <= 3, -1, 1) * as.POSIXlt(dt)$wday
بدلا من ذلك.
نصائح أخرى
حل آخر: استعادة سمة الفصل عن طريق الاتصال بالإنترنت.:
giveacodicetagpre. لا حاجة لاستخدام ifelse
هنا، وسوف يقوم GualacodiceticeTagCodeGcode بالفرس:
أو حتى أكثر بساطة:
giveacodicetagpre.1) جرب هذا:
wday <- as.POSIXlt(dt)$wday
dt + ifelse(wday <= 3, -wday, 7-wday)
وهذا ينطبق على ifelse
إلى عدد الأيام المضافة أو المطروحة. ifelse
يعمل بشكل جيد مع الأرقام العادية ولكن ليس مع الأنواع المعقدة مثل "Date"
فئة لذلك هذا يتجنب تطبيق ifelse
إلى "Date"
كائنات الطبقة.
لاحظ أنه إذا wday > 3
ثم نريد أن نضيف 7-wday
و لا wday
(كما في السؤال).
الحل هنا يستمر في العمل حتى لو dt
هو ناقل التواريخ.
2) لاحظ أنه يمكن كتابة السطر الثاني من الإجابة في (1) بالتناوب بالطريقة التالية التي تحسب أولا يوم الأحد الأخير (dt-wday
) ويضيف 7 للحصول على يوم الأحد المقبل إذا الأربعاء الماضي في الأسبوع.
dt - wday + ifelse(wday > 3, 7, 0)
3) طريقة أخرى للتعبير عن هذا هي:
dt - wday + 7 * (wday > 3)