حساب فرق الوقت بين عمودين
سؤال
بعد تحويل العوامل بتنسيق POSIXCT ثم تطبيق تنسيق التاريخ والوقت، أريد أن أحسب الفرق بين التاريخ والوقت بين 2 pos1 وpos2.
ومع ذلك، عندما أفعل ذلك لعنصر معين، أحصل على الإجابة الصحيحة في وحدة التحكم ولكن عندما أقوم بالعملية على المجموعة بأكملها، فإن وحدة التحكم تخرج رقمًا فقط ويعكس إطار التاريخ أيضًا هذا الرقم كما ترون.
كيف يمكنني الحصول على الساعات في إطار البيانات عندما أحاول أخذ الفرق؟أنا أستخدم حزمة lubridate، هل هناك أي وظيفة للقيام بذلك؟
فيما يلي بعض الأمثلة على الكود/الصورة للبيانات الموجودة في RStudio التي تصفها
CR_Date <- data.frame(
pos1="2014-07-01 00:00:00",
pos2=c("2014-07-01 00:00:00","2014-07-01 10:15:00")
)
CR_Date[] <- lapply(CR_Date,as.POSIXct)
CR_Date
# pos1 pos2
#1 2014-07-01 2014-07-01 00:00:00
#2 2014-07-01 2014-07-01 10:15:00
CR_Date$pos2[2] - CR_Date$pos1[2]
#Time difference of 10.25 hours
CR_Date$hours <- CR_Date$pos2 - CR_Date$pos1
المحلول
أولا، هذا ليس له علاقة بالتشحيم.
ثانيًا، لقد خذلك RStudio عن طريق العبث بطباعة المتغير في نافذة العرض.إذا دخلت CR_Date$hours
في نافذة سطر الأوامر سترى أنه يطبع
#Time differences in secs
#[1] 0 36900
و head(CR_Date)
يعطي:
# pos1 pos2 hours
#1 2014-07-01 2014-07-01 00:00:00 0 secs
#2 2014-07-01 2014-07-01 10:15:00 36900 secs
أي منهما كان سيخبرك بما يتم عرضه.
كما يقترح @Victorp، difftime
هو الطريق لحل هذا:
CR_Date$hours <- with(CR_Date, difftime(pos2,pos1,units="hours") )
CR_Date
# pos1 pos2 hours
#1 2014-07-01 2014-07-01 00:00:00 0.00 hours
#2 2014-07-01 2014-07-01 10:15:00 10.25 hours
نصائح أخرى
يمكنك أيضًا استخدام "as.double
الطريقة" و units
حجة (انظر ?diffime
):
as.double
طريقة [as.double(x, units = "auto", ...)
] تُرجع القيمة الرقمية المعبر عنها بالوحدات المحددة
...أين x
يكون
كائن يرث من الطبقة
"difftime"
تنطبق على المثال الخاص بك، حيث pos2 - pos1
سيؤدي إلى أ difftime
هدف:
CR_Date$hours <- as.double(CR_Date$pos2 - CR_Date$pos1, units = "hours")
CR_Date
# pos1 pos2 hours
#1 2014-07-01 2014-07-01 00:00:00 0.00
#2 2014-07-01 2014-07-01 10:15:00 10.25
أو غيرها units
:
as.double(CR_Date$pos2 - CR_Date$pos1, units = "mins")
#[1] 0 615
as.double(CR_Date$pos2 - CR_Date$pos1, units = "days")
#[1] 0.0000000 0.4270833