【问题标题】:Intelligent Way To Create Summary Table Without For Loop In R在 R 中不使用 For 循环创建汇总表的智能方法
【发布时间】:2014-03-11 18:36:51
【问题描述】:

下午好,

我有一个如下的数据框,第一列是时间戳,POSIXlt,第二列是数据值:

Date            Data
9/9/13 12:48    0.24
9/12/13 10:26   0.26
9/13/13 13:00   -0.14
9/17/13 11:31   -0.04
9/17/13 15:43   0.04
9/18/13 11:51   -0.04
9/18/13 14:35   -0.08
9/18/13 15:11   -0.08
9/19/13 10:12   -0.08
9/19/13 11:48   -0.16

我想按天汇总数据列,如下所示:

Date    Total For Day
9/9/13      0.24
9/12/13     0.26
9/13/13     -0.14
9/17/13      0   
9/18/13     -0.20
9/19/13     -0.24

我最初的反应是创建一个for循环如下:

  • 运行 unique(as.Date(Date Column)) 以获取所有日期的列表。
  • 只要初始数据表中的当前日期与正在检查的唯一列表中的日期匹配,就可以通过创建总计来循环遍历此新列表。
  • 一旦日期不匹配,记录总数并在下一个日期重复,直到列表完成。

10 次中有 9 次,当我在 R 中执行 for 循环时,总会有一个命令或方法可以更轻松、更有效地完成它。

在这种情况下,有没有比 for 循环更好的方法?

【问题讨论】:

  • 我认为您的输出不正确。 9/17/13 出现两次,9/19/13 从未出现,9/18/13 的总数不正确
  • 感谢 Jake 指出这一点,我已更正。

标签: r for-loop


【解决方案1】:

如果dat是你的数据:

aggregate(dat$Data, list(as.Date(dat$Date)), sum)

##      Group.1     x                                                                                                                                                                                                                         
## 1 2013-09-09  0.24                                                                                                                                                                                                                         
## 2 2013-09-12  0.26                                                                                                                                                                                                                         
## 3 2013-09-13 -0.14                                                                                                                                                                                                                         
## 4 2013-09-17  0.00                                                                                                                                                                                                                         
## 5 2013-09-18 -0.20                                                                                                                                                                                                                         
## 6 2013-09-19 -0.24  

其他人的数据:

structure(list(Date = structure(list(sec = c(0, 0, 0, 0, 0, 0,                                                                                                                                                                               
 0, 0, 0, 0), min = c(48L, 26L, 0L, 31L, 43L, 51L, 35L, 11L, 12L,                                                                                                                                                                             
 48L), hour = c(12L, 10L, 13L, 11L, 15L, 11L, 14L, 15L, 10L, 11L                                                                                                                                                                              
 ), mday = c(9L, 12L, 13L, 17L, 17L, 18L, 18L, 18L, 19L, 19L),                                                                                                                                                                                
     mon = c(8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L), year = c(113L,                                                                                                                                                                          
     113L, 113L, 113L, 113L, 113L, 113L, 113L, 113L, 113L), wday = c(1L,                                                                                                                                                                      
     4L, 5L, 2L, 2L, 3L, 3L, 3L, 4L, 4L), yday = c(251L, 254L,                                                                                                                                                                                
     255L, 259L, 259L, 260L, 260L, 260L, 261L, 261L), isdst = c(1L,                                                                                                                                                                           
     1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), .Names = c("sec", "min",                                                                                                                                                                           
 "hour", "mday", "mon", "year", "wday", "yday", "isdst"), class = c("POSIXlt",                                                                                                                                                                
 "POSIXt")), Data = c(0.24, 0.26, -0.14, -0.04, 0.04, -0.04, -0.08,                                                                                                                                                                           
 -0.08, -0.08, -0.16)), .Names = c("Date", "Data"), row.names = c(NA,                                                                                                                                                                         
 -10L), class = "data.frame")

【讨论】:

  • 这只是一个修改。格式命令返回一个错误:无效的“修剪”参数。我改为按如下方式运行命令:aggregate(dat$data, list(as.Date(dat$Date)), sum)。
  • @user2926358 无论如何使用as.Date 更简洁。我会编辑答案。
【解决方案2】:

或者:

使用ddply:

 require(plyr)
 ddply(yourData, "Date", summarize, Total_for_day = sum(Data))

使用dplyr

require(dplyr)
yourData %.% group_by(Date) %.% summarize(Total_for_day = sum(Data))

tapply:

tapply(X = yourData$Data, INDEX = yourData$Date, FUN = sum)

【讨论】:

    【解决方案3】:

    我会使用dplyr 进行此类操作。您的示例不可重现,我将使用内置的 mtcars 数据集。下面计算每个独特气缸尺寸的每加仑平均英里数:

    library(dplyr)
    summarise(group_by(mtcars, cyl), mean_mpg = mean(mpg))
    Source: local data frame [3 x 2]
    
      cyl mean_mpg
    1   8 15.10000
    2   4 26.66364
    3   6 19.74286
    

    【讨论】:

    • 谢谢保罗。我见过提到这个图书馆,但我没有任何经验。我会研究它,因为它看起来非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2020-07-18
    • 1970-01-01
    • 2018-02-18
    相关资源
    最近更新 更多