首页 > 解决方案 > 基于R中的列基于间隔制作垃圾箱

问题描述

我正在尝试根据特定的时间间隔制作垃圾箱,并且我希望垃圾箱在试用号更改时重新开始计数。这是示例数据:

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

我已经尝试过 cut 功能并且能够按间隔进行剪切,但我不知道如何计算试用号。谢谢你的帮助!

标签: rdataframebinning

解决方案


一个简单的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

编辑:

如果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)

推荐阅读