什么是在数据框中处理连接和平均值的最佳函数?

3

我有一个数据框来自这段代码:

   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

哪些函数最适合处理数据框中连接这些值的情况?
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而不是NA作为最后一个std.dev。

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


谢谢Dirk,使用plyr包运行得很好,但是你能告诉我如何向数据添加另一列吗?我在真实数据集中还有一个名为day的列。我尝试了这个:ddply(individual_well_series_od, "read_time", function(X) data.frame(od=mean(X$od),stdev=sd(X$od), day=X$day)),但它返回所有的 read_times。我意识到我没有对day应用函数,但我已经阅读了帮助文档,却不知道该把它放在哪里。 - John
我尝试了原始代码,没有在日期周围加上"",但是日期读取不正确,所以我保留了它们。我可以尝试将它们转换为日期对象,但我将其保持为这个简单的示例。 - John
关于添加变量,你不能这样做——ddply调用将多行缩减为单行摘要。如果您添加一个原始数据列,则会出现重复。你必须仔细考虑这个问题。 - Dirk Eddelbuettel
1
或者使用内置的 summarize 助手函数:ddply(my_df, "read_time", summarise, OD = mean(OD), stdev = sd(OD)) - hadley
1
总结(用z)还是概括(用s)或两者都可以?;-) R在支持英式和美式拼写方面非常迷人... - Dirk Eddelbuettel
显示剩余2条评论

3
您可以尝试使用data.table软件包。如果您熟悉MySQL,那么很容易掌握所有功能;否则,基础知识也足够了;-)
my_dfdt<-data.table(my_df)
mean<-my_dfdt[,mean(OD), by="read_time"]
sd<-  ..  

你还可以在一行中同时加入两个函数,或者在最后使用cbind,取决于你的个人喜好。
另一个优点:如果你有大样本数据,它非常快速。非常快速……请参考文档了解原因。

1
这说明了如何使用aggregateread_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

2
如果你只是想调用一个已经存在的函数,你不必定义自己的匿名函数。你可以传递现有的函数:aggregate(my_df$OD,by=list(my_df$read_time),mean) - Jyotirmoy Bhattacharya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接