我有一个数据集'相册'。它看起来像这样:
uid date1
1 30-01-2012
1 5-02-2012
1 19-03-2012
1 12-06-2012
2 8-02-2012
2 14-05-2012
2 17-06-2012
我想计算行之间时间的平均值和标准差PER UID。数据框中的行是每个uid的顺序和升序日期。
我该怎么做?每组第一行的事件间时间总是0,因为没有要比较的行。我不希望0扭曲我的均值或标准偏差。
答案 0 :(得分:2)
以下是一些解决方案。假设输入在最后的注释中可重复显示。请注意,在该注释中,我们为"Date"
(而不是date1
或"factor"
类列创建了"character"
类列。
1) aggregate
。没有包使用。
stats <- function(x) {
delta <- diff(x)
c(mean = mean(delta), sd = sd(delta))
}
aggregate(date1 ~ uid, DF, stats)
,并提供:
uid date1.mean date1.sd
1 1 44.66667 39.52636
2 2 65.00000 43.84062
2)dplyr
library(dplyr)
DF %>%
group_by(uid) %>%
summarize(mean = mean(diff(date1)), sd = sd(diff(date1)))
,并提供:
Source: local data frame [2 x 3]
uid mean sd
(int) (dfft) (dbl)
1 1 44.66667 days 39.52636
2 2 65.00000 days 43.84062
3)data.table
library(data.table)
data.table(DF)[, list(mean = mean(diff(date1)), sd = sd(diff(date1))), by=uid]
,并提供:
uid mean sd
1: 1 44.66667 days 39.52636
2: 2 65.00000 days 43.84062
注意:可重复形式的输入数据框DF
为:
Lines <- "uid date1
1 30-01-2012
1 5-02-2012
1 19-03-2012
1 12-06-2012
2 8-02-2012
2 14-05-2012
2 17-06-2012"
DF <- read.table(text = Lines, header = TRUE)
DF$date1 <- as.Date(DF$date1, "%d-%m-%Y")