كيف يمكنني مطابقة إطارات البيانات بفواصل زمنية؟
سؤال
هذه مشكلة تظهر في كثير من الأحيان عندما أقوم باستيراد البيانات الأولية من سجلات البيانات. تم تعيين مسجل درجات الحرارة لتسجيل درجة الحرارة كل عشر دقائق ، ويتم تعيين مسجل غاز منفصل لتسجيل الغاز المستخدم في الفاصل الزمني العشر الأخير. أرغب في الجمع بين البيانات من هذين اللوجين في إطار بيانات واحد للتخطيط والتحليل ، ولكن الأوقات ليست محاذاة بالضبط. أرغب في الحصول على صف واحد في إطار البيانات لكل فترة عشر دقائق ، مع إظهار DateTime بداية الفترة الزمنية.
تبدو بيانات مسجل درجة الحرارة مثل:
datetime temperature 2010-09-30 06:58:53 78.996 2010-09-30 07:08:53 78.645 2010-09-30 07:18:53 78.514 2010-09-30 07:28:53 79.173 2010-09-30 07:38:53 78.602
تبدو بيانات مسجل الغاز مثل:
datetime gas 2010-09-30 13:45:00 0 2010-09-30 13:55:00 1 2010-09-30 14:05:00 0 2010-09-30 14:15:00 4 2010-09-30 14:25:00 2
أرغب في الجمع بين إطار البيانات على فترات زمنية مدتها عشر دقائق ، بحيث تبدو البيانات المشتركة:
datetime temperature gas 2010-09-30 13:40:00 NA 0 2010-09-30 13:50:00 78.996 1 2010-09-30 14:00:00 78.645 0 2010-09-30 14:10:00 78.514 4 2010-09-30 14:20:00 79.173 2 2010-09-30 07:38:53 78.602 NA
إليك بعض التعليمات البرمجية للحصول على هذين إطارين البيانات:
temps <- data.frame(datetime=c("2010-09-30 06:58:53",
"2010-09-30 07:08:53","2010-09-30 07:18:53",
"2010-09-30 07:28:53","2010-09-30 07:38:53"),
temperature=c(78.996,78.645,78.514,79.173,78.602),
stringsAsFactors=FALSE)
temps$datetime <- strptime(temps$datetime, format="%Y-%m-%d %H:%M:%S")
gas <- data.frame(datetime=c("2010-09-30 13:45:00",
"2010-09-30 13:55:00","2010-09-30 14:05:00",
"2010-09-30 14:15:00","2010-09-30 14:25:00"),
gas=c(0,1,0,4,2),stringsAsFactors=FALSE)
gas$datetime <- strptime(temps$datetime, format="%Y-%m-%d %H:%M:%S")
المحلول
يستخدم align.time
في XTS.
library(xts)
xTemps <- align.time(xts(temps[,2],as.POSIXct(temps[,1])), n=600)
xGas <- align.time(xts(gas[,2],as.POSIXct(gas[,1])), n=600)
merge(xTemps,xGas)
نصائح أخرى
استخدم أي من حديقة حيوان أو XTS لعقد بياناتك - merge()
الوظيفة ستفعل هذا من أجلك. يمكنك البحث عن الإجابات السابقة هنا. ال حديقة حيوان الوثائق لديها أيضا الكثير من الأمثلة ذات الصلة.
فيما يلي مثال نموذجية:
> set.seed(42)
> temps <- zoo(78+rnorm(5),
+ order.by=ISOdatetime(2010,9,30,6,58,53)+cumsum(60*runif(5)))
> gas <- zoo(sample(1:5,5),
+ order.by=ISOdatetime(2010,9,30,6,58,53)+cumsum(60*runif(5)))
> merge(temps,gas)
temps gas
2010-09-30 06:59:47 78.048 NA
2010-09-30 06:59:49 NA 5
2010-09-30 07:00:44 76.895 NA
2010-09-30 07:00:48 NA 1
2010-09-30 07:00:55 NA 3
2010-09-30 07:01:01 78.539 NA
2010-09-30 07:01:23 NA 2
2010-09-30 07:01:51 78.580 NA
2010-09-30 07:01:57 NA 4
2010-09-30 07:02:29 77.342 NA
> na.locf(merge(temps,gas))
temps gas
2010-09-30 06:59:49 78.048 5
2010-09-30 07:00:44 76.895 5
2010-09-30 07:00:48 76.895 1
2010-09-30 07:00:55 76.895 3
2010-09-30 07:01:01 78.539 3
2010-09-30 07:01:23 78.539 2
2010-09-30 07:01:51 78.580 2
2010-09-30 07:01:57 78.580 4
2010-09-30 07:02:29 77.342 4
>