【问题标题】:R: What are the best functions to deal with concatenating and averaging values in a data.frame?R:处理 data.frame 中的连接和平均值的最佳函数是什么?
【发布时间】:2011-01-29 05:47:49
【问题描述】:

我有一个来自这段代码的 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 中连接这些值的最佳函数是什么?

【问题讨论】:

    标签: r dataframe concatenation average


    【解决方案1】:

    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 构造中使用的引号(在变量上)。

    【讨论】:

    • 感谢 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 再次。我意识到我今天没有应用函数,但我阅读了帮助但看不到将它放在哪里。
    • 我尝试了原始代码,但日期周围没有“”,但日期读取不正确,所以我保留了它们,我本可以尝试将它们转换为我认为的日期对象,但是我把它作为这个简单的例子。
    • 不是日期,变量,即使用 data.frame(a=1:3) 而不是 data.frame("a"=1:3) 至于添加变量,你可以' t -- ddply 调用减少几个行到一个单行摘要。如果您添加原始数据列,那么您会得到重复。你必须考虑清楚。
    • 或者使用内置的summarize辅助函数:ddply(my_df, "read_time", summarise, OD = mean(OD), stdev = sd(OD))
    • 总结(用z)或总结(用s)或两者兼而有之? ;-) R 在支持英式和美式拼写方面非常迷人...
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 如果您只想调用现有函数,则不必定义自己的匿名函数。可以通过现有函数:aggregate(my_df$OD,by=list(my_df$read_time),mean)
      猜你喜欢
      • 2020-04-17
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多