减少数据帧中的数据以在R中绘制数据

时间:2013-12-11 19:18:15

标签: r plot

我对编程非常陌生,所以我提前为我缺乏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个样本)。但是,我不确定这样做的最有效/最佳方式是什么。

对不起,我不能再具体了。任何粗略的指导都将非常感激。

2 个答案:

答案 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))

enter image description here