3

我有一个来自这段代码的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

我想在每个不同的 read_time 上平均 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 中连接这些值的最佳函数?

4

3 回答 3

7

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 而不是最后一个 std.dev 的 NA。

此外,您不需要 data.frame 构造中的引号(在变量上)。

于 2010-03-18T22:14:32.807 回答
3

你可以试试包data.table。如果您了解 MySQL,那么您应该很容易获得所有功能,否则基础知识也足够好;-)

my_dfdt<-data.table(my_df)
mean<-my_dfdt[,mean(OD), by="read_time"]
sd<-  ..  

您也可以在一行中加入或在最后加入 cbind,您的风格

另一个优点:如果您有大量样本,它的速度非常快。非常快...请参阅文档原因。

于 2010-03-19T21:15:26.703 回答
1

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
于 2010-03-19T03:10:23.783 回答