2013-12-11 5 views
1

Я очень новичок в программировании, поэтому заранее извиняюсь за недостаток ноу-хау R. Я студент PhD, заинтересованный в ученической деятельности, и я только что записал ответ ученика, выполняющий слушание, в двух условиях (Easy and Hard). Период отклика ученика на участие в каждом испытании составляет около 20 секунд, и я хотел бы иметь возможность отображать эти данные для каждого участника на R. Частота дискретизации для зрителей составляет 1000 Гц, и каждый участник завершил 92 испытания. Таким образом, данные, которые у меня есть для каждого участника, составляют около 2 миллионов строк. Я попытался построить это с помощью ggplot2, но, как и ожидалось, график очень загроможден.Уменьшение данных в фрейме данных для построения данных в R

Я пытался разработать способ уменьшения данных, чтобы я мог нанести его на R. В идеале я хотел бы принять среднее значение размера зрачка для каждых 1000 выборок (т.е. 1 секунду записи) усредненный по всем 92 испытаниям для каждого участника. С этой информацией я бы тогда создал новый dataframe для построения среднего склона с 1-20 секунд для двух условий прослушивания (Easy and Hard).

Это текущая структура в базе данных данных;

> 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" ... 

переменная 'TrialTime' указывает образец (т.е. миллисекунды) в каждом испытании. Может ли кто-нибудь сообщить мне, какой шаг я должен предпринять дальше? Я полагаю, что было бы целесообразно упорядочить мои данные в отдельные кадры данных, которые позволят мне рассчитать средние значения, которые я хочу (в рамках испытаний и для каждых 1000 выборок). Однако я не уверен, что это самый эффективный/лучший способ сделать это.

Прошу прощения, что я не могу быть более конкретным. Любые грубые рекомендации будут высоко оценены.

+0

ИМХО было бы лучше, если бы Вы отправили данные где-то, что мы могли бы получить на него , Или, по крайней мере, представительное подмножество. – jlhoward

+0

FYI: RIGHT_PUPIL_SIZE имеет в нем нечисловые данные - вы можете избавиться от этого, установив их как «na.strings» в вашем импорте. 'read.csv (" myfile.csv ", na.strings =". ")' –

+0

Брэндон, спасибо, что указали, что нет - я только что изменил эту переменную, так что это всего лишь числовые данные. JLHoward, спасибо за ваш комментарий. Я постараюсь опубликовать свои данные, если у меня появятся новые запросы. – Ronan

ответ

0

Я думаю, что для такого большого блока данных с большим количеством уровней агрегирования вам нужно будет использовать data.table. Я, возможно, неправильно структурированы данные, но, надеюсь, это даст вам идею: (? Dropbox)

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

+0

Спасибо, я ценю этот пример. Одна проблема, которую я испытываю, пытается суммировать каждую секунду (каждые 1000 миллисекунд). Я думаю, что способ, которым вы продемонстрировали это здесь (понятно), предполагает, что для каждого пациента имеется ровно 20000 строк. Однако, к сожалению, ряды/образцы различной длины для каждого пациента. Итак, что я хотел бы сделать, это добавить переменную, которая описывает, к какому второму относится каждый образец (например, 1:20) на основе такого типа маркировки; 1: 1000 = 1, 1001: 2000 = 2, 2001: 3000 = 3 и так далее, пока образцы не закончится. Можете ли вы придумать способ сделать это? – Ronan

+0

Или, конечно, кто-нибудь еще в этом отношении? – Ronan

+0

@Ronan Sure - одно быстрое изменение вызова 'cut()', который я сделаю выше - 'ppt53data $ group <-cut (ppt53data $ TrialTime, c (0, seq (1000,20000,1000), Inf))» – Troy

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))) 
+0

Спасибо Брэндон, это очень полезная отправная точка! – Ronan

+0

Этот код оказался очень полезным, поскольку он выполнял одну из задач, которые я собирался сделать (средний размер зрачка для каждой секунды в каждом испытании). Я надеялся, что смогу использовать аналогичный код для поиска средних значений для каждых 1000 выборок. Используя функцию ddply(), есть ли способ применить среднюю функцию к каждому 1000 выборкам в данных, а не делать это для каждого уникального значения (как в коде, который вы указали)? – Ronan

+0

Я обновлю ответ на примере, который показывает вам, как взять случайный образец из 1000. –

Смежные вопросы