我对编程非常陌生,所以我提前为我缺乏R知识而道歉。我是一名对瞳孔测量学感兴趣的博士生,我刚刚记录了在两种情况下(简单和困难)执行听力任务的参与者的瞳孔反应。每次试验的学生反应兴趣期约为20秒,我希望能够为R上的每个参与者绘制这些数据。眼动仪采样率为1000Hz,每个参与者完成92次试验。因此,我目前为每个参与者提供的数据包括接近200万行。我试图使用ggplot2来绘制这个,但正如预期的那样,图形非常混乱。
我一直试图找出一种减少数据的方法,以便我可以在R上绘制它。理想情况下,我想取每1000个样本的平均瞳孔大小值(即记录1秒) )平均每个参与者的所有92个试验。有了这些信息,我就会创建一个新的数据帧,用于绘制两个收听条件(简单和难度)的平均斜率1-20秒。
这是我的数据框的当前结构;
> str(ppt53data)
'data.frame': 1915391 obs. of 6 variables:
$ RECORDING_SESSION_LABEL: Factor w/ 1 level "ppt53": 1 1 1 1 1 1 1 1 1 1 ...
$ listening_condition : Factor w/ 2 levels "Easy","Hard": 2 2 2 2 2 2 2 2 2 2 ...
$ RIGHT_PUPIL_SIZE : Factor w/ 3690 levels ".","0.00","1000.00",..: 3266 3264 3263 3262 3262 3260 3257 3254 3252 3252 ...
$ TIMESTAMP : num 262587 262588 262589 262590 262591 ...
$ TRIAL_START_TIME : int 262587 262587 262587 262587 262587 262587 262587 262587 262587 262587 ...
$ TrialTime : num 0 1 2 3 4 5 6 7 8 9 ...
- attr(*, "na.action")=Class 'omit' Named int [1:278344] 873 874 875 876 877 878 879 880 881 882 ...
.. ..- attr(*, "names")= chr [1:278344] "873" "874" "875" "876" ...
试用时间'变量指定每个试验中的样本(即毫秒)。谁能告诉我接下来应该采取哪一步?我认为将数据安排到单独的数据框中是有意义的,这样我就可以计算出我想要的平均值(跨试验和每1000个样本)。但是,我不确定这样做的最有效/最佳方式是什么。
对不起,我不能再具体了。任何粗略的指导都将非常感激。
答案 0 :(得分:0)
一些粗略的指导:
library(plyr)
ppt53data.summarized <- ddply(ppt53data, .(TrialTime), summarize, mean = mean(RIGHT_PUPIL_SIZE))
这告诉它计算每个独特TrialTime的右瞳孔的平均大小。也许看看它是如何工作的,可以帮助你弄清楚如何描述你需要的东西?
假设在每个TrailTime中有超过1000个观察值,您可以随机选择:
set.seed(42)
ppt53data.summarized <- ddply(ppt53data, .(TrialTime), summarize, mean = mean(sample(RIGHT_PUPIL_SIZE,1000)))
答案 1 :(得分:0)
我认为对于包含许多聚合级别的大量数据,您需要使用data.table
。我可能错误地构建了您的数据,但希望这会给您一个想法:
require(data.table)
require(ggplot2)
#100 patient * 20,000 observations (1-20,000 ms)
ppt53data<-data.frame(
RECORDING_SESSION_LABEL=paste0("pat-",rep(1:100,each=20000)), #patients
listening_condition=sample(c("Easy","Hard"),2000000,replace=T), #Easy/Hard
RIGHT_PUPIL_SIZE=rnorm(2000000,3000,500), #Pupil Size
TrialTime=rep(1:20000,100) #ms from start
)
# group in 1000ms blocks
ppt53data$group<-cut(ppt53data$TrialTime,c(0,seq(1000,20000,1000),Inf))
unique(ppt53data$group)
#convert frame to table
dt.ppt53data<-data.table(ppt53data)
#index
setkey(dt.ppt53data, RECORDING_SESSION_LABEL, group)
#create data.frame of aggregated plot data
plot.data<-data.frame(dt.ppt53data[,list(RIGHT_PUPIL_SIZE=mean(RIGHT_PUPIL_SIZE)),by=list(group)])
#plot with ggplot2
ggplot(plot.data)+geom_bar(aes(group,RIGHT_PUPIL_SIZE,stat="identity",fill=group)) +
theme(axis.text.x=element_text(angle=-90))+
coord_cartesian(ylim=c(2995,3005))