基于R中的列的间隔制作箱

Mar*_*ova 3 r binning dataframe

我试图根据特定的时间间隔制作垃圾箱,我希望垃圾箱在试用号更改时重新开始计数.以下是示例数据:

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))
Run Code Online (Sandbox Code Playgroud)

以下是数据集的外观:

   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
Run Code Online (Sandbox Code Playgroud)

我的目标是在每个试验编号内制作.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
Run Code Online (Sandbox Code Playgroud)

我已经尝试过切割功能并能够按间隔切割,但我无法弄清楚如何计算试用次数.谢谢你的帮助!

Kar*_*ius 6

一个简单的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
Run Code Online (Sandbox Code Playgroud)

编辑:

如果trial_Nr没有订购,tapply可能会搞砸订单.然后你可以简单地一步一步地拆分:

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)
Run Code Online (Sandbox Code Playgroud)