Создание бинов на основе интервала на основе столбца в R - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь создать ячейки на основе определенного интервала времени и хочу, чтобы ячейки возобновили подсчет при изменении номера пробной версии. Вот пример данных:

structure(list(Trial_Nr = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L, 2L, 2L), seconds = c(1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 
3, 3.25, 3.5, 3.75)), .Names = c("Trial_Nr", "seconds"), class = "data.frame", row.names = c(NA, 
-12L))

Вот как выглядит набор данных:

   Trial_Nr seconds
1         1    1.00
2         1    1.25
3         1    1.50
4         1    1.75
5         1    2.00
6         1    2.25
7         2    2.50
8         2    2.75
9         2    3.00
10        2    3.25
11        2    3.50
12        2    3.75

Моя цель состоит в том, чтобы сделать 0,50-секундные ячейки внутри каждого номера испытания, причем ячейки начинаются заново в начале нового испытания. Только к вашему сведению: реальный набор данных имеет гораздо больше точек данных, а столбец секунд не имеет равных интервалов. Это моя цель:

   Trial_Nr seconds bin
1         1    1.00   1
2         1    1.25   1
3         1    1.50   2
4         1    1.75   2
5         1    2.00   3
6         1    2.25   3
7         2    2.50   1
8         2    2.75   1
9         2    3.00   2
10        2    3.25   2
11        2    3.50   3
12        2    3.75   3

Я пробовал использовать функцию обрезки, и мне удалось обрезать по интервалам, но я не мог понять, как учесть номер испытания. Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 08 января 2019

А просто tapply сделает это:

myData$bin <- unlist(tapply(myData$seconds, myData$Trial_Nr, function(x) (x-min(x)) %/% 0.5 + 1))

> myData
   Trial_Nr seconds bin
1         1    1.00   1
2         1    1.25   1
3         1    1.50   2
4         1    1.75   2
5         1    2.00   3
6         1    2.25   3
7         2    2.50   1
8         2    2.75   1
9         2    3.00   2
10        2    3.25   2
11        2    3.50   3
12        2    3.75   3

EDIT:

Если trial_Nr не заказан, tapply может испортить порядок. Тогда вы можете просто сделать это шаг за шагом с помощью split:

dat <- split(myData, myData$Trial_Nr)
dat <- lapply(dat, function(x) {x$bin <- (x$seconds-min(x$seconds)) %/% 0.5 + 1; x})
dat <- unsplit(dat, myData$Trial_Nr)
...