之前我问过这个问题并得到了一个解决方案,为我解决了这个问题。我有一个如下所示的数据框:
id weekdays halflife
241732222300860000 Friday, Aug 31, 2012, 22 0.4166666667
241689170123309000 Friday, Aug 31, 2012, 19 0.3833333333
241686878137512000 Friday, Aug 31, 2012, 19 0.4
241651117396738000 Friday, Aug 31, 2012, 16 1.5666666667
241635163505820000 Friday, Aug 31, 2012, 15 0.95
241633401382265000 Friday, Aug 31, 2012, 15 2.3666666667
我希望获得周一创建的项目的平均半衰期,然后是星期二......等等。 (我的日期范围超过6个月)。
要获取我使用strptime
和difftime
的日期值。另外,我找到max(df$halflife)
的最大半衰期,我怎样才能找到它对应的id?
可重复的代码:
structure(list(id = c(241732222300860416, 241689170123309056,
241686878137511936, 241651117396738048, 241635163505819648, 241633401382264832
), weekdays = c("Friday, Aug 31, 2012, 22", "Friday, Aug 31, 2012, 19",
"Friday, Aug 31, 2012, 19", "Friday, Aug 31, 2012, 16", "Friday, Aug 31, 2012, 15",
"Friday, Aug 31, 2012, 15"), halflife = structure(c(0.416666666666667,
0.383333333333333, 0.4, 1.56666666666667, 0.95, 2.36666666666667
), class = "difftime", units = "mins")), .Names = c("id",
"weekdays", "halflife"), row.names = c(NA, 6L), class = "data.frame")
所以现在,我有所有星期一,星期二等的平均半衰期值。如何获得这些工作日内所有小时的平均值,即:在所有星期一上午9点,然后上午10点,然后上午11点创建的所有项目的平均半衰期。等等。然后星期二上午9点,上午10点,上午11点......等等。工作日列中的日期已格式化,以便逗号后面的最后一个数字是创建它的小时。我对正则表达式和模式匹配非常不好,这就是为什么我要问这个后续问题。
答案 0 :(得分:1)
使用基本软件包,您可以执行以下操作。
> mydf
id weekdays halflife
1 2.417322e+17 Friday, Aug 31, 2012, 22 0.4166667 mins
2 2.416892e+17 Friday, Aug 31, 2012, 19 0.3833333 mins
3 2.416869e+17 Friday, Aug 31, 2012, 19 0.4000000 mins
4 2.416511e+17 Friday, Aug 31, 2012, 16 1.5666667 mins
5 2.416352e+17 Friday, Aug 31, 2012, 15 0.9500000 mins
6 2.416334e+17 Friday, Aug 31, 2012, 15 2.3666667 mins
我们可以只使用strsplit
的每个元素weekdays
,unlist
结果,而不是使用正则表达式,而是以{4}格式返回matrix
和{ {1}}以cbind
返回。
mydf
现在我们已经适当地拆分了工作日列,我们可以使用> mydf2 <- cbind(mydf, matrix(unlist(sapply(mydf$weekdays, strsplit, split=',')), byrow=TRUE, ncol=4, dimnames=list(1:nrow(mydf), c('Weekday', 'Day', 'Year', 'Hour'))))
> mydf2
id weekdays halflife Weekday Day Year Hour
1 2.417322e+17 Friday, Aug 31, 2012, 22 0.4166667 mins Friday Aug 31 2012 22
2 2.416892e+17 Friday, Aug 31, 2012, 19 0.3833333 mins Friday Aug 31 2012 19
3 2.416869e+17 Friday, Aug 31, 2012, 19 0.4000000 mins Friday Aug 31 2012 19
4 2.416511e+17 Friday, Aug 31, 2012, 16 1.5666667 mins Friday Aug 31 2012 16
5 2.416352e+17 Friday, Aug 31, 2012, 15 0.9500000 mins Friday Aug 31 2012 15
6 2.416334e+17 Friday, Aug 31, 2012, 15 2.3666667 mins Friday Aug 31 2012 15
函数来计算aggregate
所需的分组列。
mean
如果您想按> aggregate(halflife ~ Weekday, data=mydf2, FUN = mean)
Weekday halflife
1 Friday 1.013889
以及Weekday
进行分组,那么
Hour
因此> aggregate(halflife ~ Weekday + Hour, data=mydf2, FUN = mean)
Weekday Hour halflife
1 Friday 15 1.6583333
2 Friday 16 1.5666667
3 Friday 19 0.3916667
4 Friday 22 0.4166667
函数的第一个参数是一个forumla对象,它支持一个,一个,多个,多个,一个和多个关系。请参阅aggregate
示例以了解如何使用它。
我将举例说明如何建立多对多关系。
?aggregate