下午好,
我有一个如下数据框,第一列中的时间戳为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循环,如下所示:
10次中有9次,当我在R中执行for循环时,总会有一个命令或方法更容易,更有效地执行它。
在这种情况下,是否有比for循环更好的方法?
答案 0 :(得分:3)
如果您是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")
答案 1 :(得分:1)
可替换地:
使用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)
答案 2 :(得分:0)
我使用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