ص:ما هي أفضل الوظائف للتعامل مع القيم المتسلسلة ومتوسطها في data.frame؟
-
20-09-2019 - |
سؤال
لدي data.frame من هذا الرمز:
my_df = data.frame("read_time" = c("2010-02-15", "2010-02-15",
"2010-02-16", "2010-02-16",
"2010-02-16", "2010-02-17"),
"OD" = c(0.1, 0.2, 0.1, 0.2, 0.4, 0.5) )
الذي ينتج هذا:
> my_df
read_time OD
1 2010-02-15 0.1
2 2010-02-15 0.2
3 2010-02-16 0.1
4 2010-02-16 0.2
5 2010-02-16 0.4
6 2010-02-17 0.5
أريد حساب متوسط عمود OD خلال كل وقت قراءة مميز (لاحظ أن بعضها يتم نسخه والبعض الآخر لا يتم نسخه) وأود أيضًا حساب الانحراف المعياري، وإنتاج جدول مثل هذا:
> my_df
read_time OD stdev
1 2010-02-15 0.15 0.05
5 2010-02-16 0.3 0.1
6 2010-02-17 0.5 0
ما هي أفضل الوظائف للتعامل مع سلسلة هذه القيم في data.frame؟
المحلول
ال plyr الحزمة تحظى بشعبية كبيرة لهذا، ولكن الوظائف الأساسية by()
و aggregate()
سوف يساعد أيضا.
> ddply(my_df, "read_time", function(X) data.frame(OD=mean(X$OD),stdev=sd(X$OD)))
read_time OD stdev
1 2010-02-15 0.15000 0.07071
2 2010-02-16 0.23333 0.15275
3 2010-02-17 0.50000 NA
يمكنك إضافة البت المفقود لإرجاع 0 بدلاً من NA لآخر std.dev.
أيضًا، لا تحتاج إلى علامات الاقتباس (على المتغيرات) التي كانت لديك في إنشاء data.frame.
نصائح أخرى
يمكنك تجربة الحزمة data.table.إذا كنت تعرف MySQL، فمن المفترض أن يكون من السهل عليك الحصول على جميع الوظائف، وإلا فإن الأساسيات جيدة بما فيه الكفاية أيضًا؛-)
my_dfdt<-data.table(my_df)
mean<-my_dfdt[,mean(OD), by="read_time"]
sd<- ..
يمكنك أيضًا الانضمام إلى كليهما في سطر واحد أو الربط في النهاية، وهو ما يناسب أسلوبك
ميزة أخرى:إنه سريع للغاية، إذا كان لديك عينات كبيرة.سريع جدًا...راجع الوثائق لماذا.
وهذا يوضح كيف يمكنك استخدام aggregate
للحصول على المتوسط والانحراف المعياري من خلال الخاص بك read_time
.
>aggregate(my_df$OD, by=list(my_df$read_time), function(x) mean(x))
Group.1 x
1 2010-02-15 0.1500000
2 2010-02-16 0.2333333
3 2010-02-17 0.5000000
>aggregate(my_df$OD, by=list(my_df$read_time), function(x) sd(x))
Group.1 x
1 2010-02-15 0.07071068
2 2010-02-16 0.15275252
3 2010-02-17 NA