2016-11-16 4 views
2

У меня есть данные из эксперимента. Мы приурочили принятие человеческих решений. У нас есть набор alternaysves (назовем их A, B, C, D), чтобы многократно выбирать из более чем 30 секундного периода, и мы время первый, затем второй, затем N-й выбор (субъект может передумать). Данные выглядит следующим образом (время в миллисекундах):Расширение и дискретирование данных временных рядов с помощью R и dplyr

subject time choice 
1  2204 A 
1  3673 B 
1  8435 C 
1  12640 B 
1  24031 A 

Я хотел бы Дискретизируем и расширить данные для того, чтобы иметь возможность получить выбранный вариант на каждый второй; по умолчанию 0, пока нет выбора (пока). В идеале, это будет выглядеть следующим образом

subject second choice 
1  1  0 
1  2  0 
1  3  A 
1  4  B 
1  5  B 
1  6  B 
1  7  B 
1  8  B 
1  9  C 
1  10  C 
1  11  C 
1  12  C 
1  13  B 

... и так далее до второй = 30.

Раствор на основе tidyverse пакетов и dplyr труб будет приветствовать. Но я открыт для других решений. Благодаря!

+0

я не в состоянии понять выходной dataframe. почему 2 A, 5 B ....? –

+0

ohhh время было в миллисекундах !! получил это –

+0

@ joel.wilson: Я знаю, что предмет выбрал A через 2.204 секунды. Следовательно, на втором 1 у него не было чоки; на втором 2, все еще нет спутника (ошибка в выходном наборе данных, отредактирована); во втором 3 предварительный выбор был A; на втором 4: он уже переключился на B (переход на B произошел после 3,673 секунды). И так далее. Мне нужно заполнить такую ​​таблицу до 30-й секунды. – PaoloCrosetto

ответ

5
library(dplyr) 
library(tidyr) 
library(zoo) 
df %>% 
    mutate(time=ceiling(time/1000)) %>% 
    complete(subject, time=1:30) %>% 
    group_by(subject) %>% 
    mutate(choice = na.locf(choice, na.rm = FALSE)) 

данные

df = structure(list(subject = c(1L, 1L, 1L, 1L, 1L), time = c(2204L, 
3673L, 8435L, 12640L, 24031L), choice = c("A", "B", "C", "B", 
"A")), .Names = c("subject", "time", "choice"), class = "data.frame", row.names = c(NA, 
-5L)) 
+0

Это хорошее спасибо, но у меня есть проблемы с расширением логики до ситуации нескольких субъектов по нескольким решениям - как и в случае с моими данными, у которых есть ~ 200 предметов на 24 разных решения. Я играю и буду одобрять, как только я смогу найти выход! спасибо – PaoloCrosetto

+0

@PaoloCrosetto, см. обновление. Теперь он должен работать для нескольких субъектов. надеюсь, что это помогает – ExperimenteR

+0

действительно я понял это. спасибо за обновление! – PaoloCrosetto

1

Это использует базовый R подход ... не может быть, элегантны, как другой ответ

dt = fread("subject time choice 
1  2204 A 
1  3673 B 
1  8435 C 
1  12640 B 
1  24031 A")  

sec <- ceiling(dt$time/1000) 
dt1 <- data.table(a = 1:30) 
dt1$b <- cumsum(1:30 %in% sec) 

x <- dt$choice[dt1$b] 
dt1$ans <- c(rep(0, 30-length(x)), x) 

dt1 
    a b ans 
1: 1 0 0 
2: 2 0 0 
3: 3 1 A 
4: 4 2 B 
5: 5 2 B 
. 
. 
. 
17: 17 4 B 
18: 18 4 B 
19: 19 4 B 
20: 20 4 B 
. 
. 
.