获得符合特定条件的值的平均值(模式匹配)

时间:2013-02-21 10:50:40

标签: regex r

之前我问过这个问题并得到了一个解决方案,为我解决了这个问题。我有一个如下所示的数据框:

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个月)。

要获取我使用strptimedifftime的日期值。另外,我找到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点......等等。工作日列中的日期已格式化,以便逗号后面的最后一个数字是创建它的小时。我对正则表达式和模式匹配非常不好,这就是为什么我要问这个后续问题。

1 个答案:

答案 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的每个元素weekdaysunlist结果,而不是使用正则表达式,而是以{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