在R中创建子集的均值函数

时间:2016-01-12 05:53:52

标签: r dplyr

我正在尝试创建一个函数,该函数将采用一些参数并返回总平均每小时回报。我的数据集如下所示:

Location    Time    units
1   Columbus    3:35    12
2   Columbus    3:58    199
3   Chicago     6:10    -45
4   Chicago     6:19    87
5   Detroit    12:05    -200
6   Detroit     0:32    11

我想要归还的是

Location    Time    units   unitsph
Columbus    7:33        211     27.9
Chicago     12:29       42      3.4
Detroit     12:37      -189    -15.1

同时还保留其他项目

基本上生产的总单位和每小时的单位。

我试过了

thing <- time %>% group_by(Location) %>% summarize(sum(units))

返回的位置和总单位,但不是每小时的单位。然后我搬到了

thing <- time %>% group_by(Location) %>% summarize(sum(units)) %>% summarize(sum(Time))

返回

Error in eval(expr, envir, enclos) : object 'Time' not found

我也试过变异但没有效果:

fin <- mutate(time, as.numeric(sum(Time))/as.numeric(sum(units)))
Error in Summary.factor(c(118L, 131L, 174L, 178L, 57L), na.rm = FALSE) : 
  ‘sum’ not meaningful for factors

这里的任何帮助都非常感谢。我还有一些我想保留的其他专栏(它们是地点的地理编码等),但没有列出这些。如果这很重要,我可以重新加入。

2 个答案:

答案 0 :(得分:2)

您的时间是一个字符串对象。你可以使用

data <- data.frame(loc=c("C","C","D","D"),time=c("1:22","1:23","1:24","1:25"),u=c(1,2,3,4))
basetime <- strptime("00:00","%H:%M")
data$in.hours <- as.double(strptime(data$time,"%H:%M")-basetime)
thing <- data %>% group_by(loc) %>% summarize(sum(u),sum(in.hours))

转换成小时并不完美。它首先将时间转换为Posix.ct对象,然后将其转换为double。但是猜猜好吧。 转换后的数据

 loc time u in.hours
1   C 1:22 1 1.366667
2   C 1:23 2 1.383333
3   D 1:24 3 1.400000
4   D 1:25 4 1.416667

所以1.366表示1h + 1/3h。 最后的结果是

    loc sum(u) sum(in.hours)
  (fctr)  (dbl)         (dbl)
1      C      3      2.750000
2      D      7      2.816667

因此,对于C,您有2小时0.75*60 minutes

答案 1 :(得分:1)

我最终参与了@CAFEBABE推荐和修改的部分内容。

我用过

mutated_time <- time %>% 
    group_by(Location) %>% 
    summarize(play 
    = sum(as.numeric(Time)/60),
    unitsph = sum(units))

加上

selektor <- as.data.frame(select(distinct(mutated_time), Location,unitsph))

让我到了我想去的地方。谢谢大家提供的许多有用的评论。