我有一个关于咖啡因如何影响考试成绩的时间序列。在每一天,第一个测试用于测量当天的基线分数,第二个分数是治疗的效果。
Post Caffeine Score Time/Date
yes 10 3/17/2014 17:58:28
no 9 3/17/2014 23:55:47
no 7 3/18/2014 18:50:50
no 10 3/18/2014 23:09:03
有些日子有咖啡因治疗,有些则没有。这是一个问题:如何按一周的天对变量进行分组,并通过减去第二天来创建影响度量。从第一个得分。
我将使用这些分组进行后续的图表和分析,所以我认为如果能够创建每天评分得分改善的对象,那么效率最高。根据是否使用咖啡因(治疗)来分组。
感谢您的帮助!
答案 0 :(得分:1)
首先为当天制作一个专栏:
df$day = strftime(df$'Time/Date', format="%Y-%m-%d")
然后我认为你所追求的是两个聚合:
1)查找当天是否有咖啡因
dayCaf = aggregate(df$Caffeine~df$day, FUN=function(x) ifelse(length(which(grepl("yes",x)))>0,1,0))
2)计算得分差异
dayDiff = aggregate(df$Score~df$day, FUN=function(x) x[2]-x[1])
现在把两者放在一起
out = merge(dayCaf, dayDiff, by='df$day')
这给出了:
df$day df$caff df$score
1 2014-03-17 1 -1
2 2014-03-18 0 3
整个代码是:
df$day = strftime(df$'Time/Date', format="%Y-%m-%d")
dayCaf = aggregate(df$Caffeine~df$day, FUN=function(x) ifelse(length(which(grepl("yes",x)))>0,1,0))
dayDiff = aggregate(df$Score~df$day, FUN=function(x) x[2]-x[1])
out = merge(dayCaf, dayDiff, by='df$day')
只需将“df”替换为您的框架名称即可。
答案 1 :(得分:0)
可替换地:
DF <- data.frame(Post.Caffeine = c("Yes","No","No","No"),Score=c(10,9,7,10),Time.Date=c("3/17/2014 17:58:28","3/17/2014 23:55:47","3/18/2014 18:50:50", "3/18/2014 23:09:03"))
DF$Time.Date <- as.Date(DF$Time.Date,format="%m/%d/%Y")
DF2 <- setNames(aggregate(Score~Time.Date,DF,diff),c("Date","Diff"))
DF2$PC <- DF2$Date %in% DF$Time.Date[DF$Post.Caffeine=="Yes"]
DF2
编辑:这假设您的数据符合您演示的顺序。
答案 2 :(得分:0)
data.table
解决方案。 order
部分首先对您的数据进行排序(如果已对其进行排序,则可以删除order
部分,只需将逗号留在原位)。这种方法的优点是你在一行中完成整个过程,而且它也会很快
library(data.table)
setDT(temp)[order(as.POSIXct(strptime(`Time/Date`, "%m/%d/%Y %H:%M:%S"))),
list(HadCafffeine = if(any(PostCaffeine == "yes")) "yes" else "no",
Score = diff(Score),
by = as.Date(strptime(`Time/Date`, "%m/%d/%Y"))]
## as.Date HadCafffeine Score
## 1: 2014-03-17 yes -1
## 2: 2014-03-18 no 3
此解决方案假定temp
为您的数据集,PostCaffeine
而不是Post Caffeine
作为变量名称(在R中将空格或/
放入变量名称是不好的做法因为它限制了你与他们合作的可能性。)