2016-08-03 2 views
0

Я пытаюсь использовать определенный порядок переменной в наборе данных - валентность и - по существу копировать и вставлять строки в новый набор данных. Итак, для каждого subID для каждой валентности = 0, если следующая валентность = -1, скопируйте эту строку в новый набор данных, называемый «sequence». Проблема заключается в том, что пробный заказ был рандомизирован, поэтому последовательность для каждого субидианта различна (в противном случае я, по крайней мере, мог бы написать большой блочный скрипт на основе пробного номера). Одна из важных вещей, о которых мне не удалось изначально упомянуть: для каждого субидиза будет различное количество значений, поэтому число строк даже не будет в пределах subID.Повторная организация данных для расчета эффектов последовательности

Подобно тому, как пример того, что данные выглядит следующим образом:

SubID location valence reaction_time 
1  1  0  500 
1  1  -1  600 
1  0  1  400 
1  0  0  500 
2  1  1  700 
2  1  0  400 
2  0  -1  700 
2  0  0  400 

Я довольно много новичок в такого рода вещи (я предполагаю, что это должна быть петля?) И Дон» t имеют твердую отправную точку, поэтому любая помощь была бы чрезвычайно оценена.

Спасибо!

ответ

2

Пусть ваши данные d:

out <- by(d, d$SubID, function(x) { 
    v <- x$valence 
    x[which(v[1:(length(v)-1)]==0 & v[2:(length(v))]==-1),] 
}) 
sequence <- do.call(rbind, out) 

Результат:

> sequence 
    SubID location valence reaction_time 
1  1  1  0   500 
2  2  1  0   400 
+0

Привет, я думаю, что вижу (вроде), как работает скрипт. Но одна вещь, о которой я не упоминал, заключается в том, что количество строк для каждого идентификатора subID отличается. Я подозреваю, что поэтому я получил эту ошибку?: 'Ошибка в tapply (seq_len (79155L), list (' factor (data $ SubID) '= integer (0)),: аргументы должны иметь одинаковую длину' – Mik

+0

Hmm, это не имеет значения (я попробовал это, изменив ваш набор данных игрушек). «Длина (коэффициент (данные $ SubID)) == nrow (data)'? (Кроме того, я отредактировал ответ, потому что я только что понял «фактор» (...) 'является посторонним.) –

+0

' length (factor (data $ SubID)) == nrow (data) 'возвращает FALSE – Mik

1

Я предполагаю, что вы хотите подмножить свои data.frame для строк 1 и 6. Вот решение data.table.

# load library and change to data.table 
library(data.table) 
setDT(df) 

# subset 
df[valence==0 & shift(valence == -1, type="lead"), .SD, by=SubID] 
    SubID location valence reaction_time 
1:  1  1  0   500 
2:  2  1  0   400 

данные

df <- read.table(header=T, text="SubID location valence reaction_time 
1  1  0  500 
1  1  -1  600 
1  0  1  400 
1  0  0  500 
2  1  1  700 
2  1  0  400 
2  0  -1  700 
2  0  0  400") 
+0

Здравствуйте, спасибо вам большое за ваше help - как я уже упоминал в своем комментарии выше, я попробовал ваш скрипт, но он возвращает 'Empty data.table (0 строк) из 4 cols: subID, location, valence, RT', есть ли у вас какие-либо мысли о том, почему это может быть так ? Спасибо! – Mik

+0

Я пробовал несколько потенциальных источников ошибок: валентность была символом или фактором, оба из которых (удивительно) работали без проблем. Переименование переменных привело к ошибке. Единственное, что я могу придумать на данный момент, это то, что у ваших данных нет шаблона, который вы ищете. Эти скрипты работают для вас с данными примера, не так ли? – lmo

+0

заставил его работать! Спасибо, ваш комментарий об этом, не имея шаблона, который я ищу, заставил меня (с 80 000 наблюдений вероятность была 0) ... еще одна ошибка начального новичка - csv был отформатирован валентной категорией (так что, конечно, они были заблокирован - реорганизация путем пробного исправления). – Mik

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