سؤال

أحاول تحديد موقع أقرب يوم أحد إلى اليوم.

أعرف اليوم على أنه:

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.

أو حتى أكثر بساطة:

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