ص:ما هي أفضل الوظائف للتعامل مع القيم المتسلسلة ومتوسطها في data.frame؟

StackOverflow https://stackoverflow.com/questions/2473659

سؤال

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