根据 R 中的列基于区间制作箱子

3

我正在尝试基于特定的时间间隔创建箱子,并且希望在试验编号改变时重新开始计数。这是示例数据:

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函数并成功进行了分段剪切,但我无法解决如何考虑试验次数的问题。感谢您的所有帮助!
1个回答

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

编辑:

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

比我的好多了。 - Joseph Clark McIntyre
@JosephClarkMcIntyre 你删掉了你的提交?没机会比较一下 :) 但是,每当问题是“按组做某事”时,所有这些tapply/by/ave/aggregate函数都变得很方便。 - Karolis Koncevičius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接