r按因子切割数据帧

r按因子切割数据帧,r,cut,R,Cut,假设我有这个 +-------+-----+------+ | Month | Day | Hour | +-------+-----+------+ | 1 | 1 | 1 | | 1 | 1 | 2 | | 1 | 1 | 3 | | 1 | 1 | 4 | | 1 | 2 | 1 | | 1 | 2 | 2 | | 1 | 2 | 3 | | 1 | 2

假设我有这个

+-------+-----+------+
| Month | Day | Hour |
+-------+-----+------+
|     1 |   1 |    1 |
|     1 |   1 |    2 |
|     1 |   1 |    3 |
|     1 |   1 |    4 |
|     1 |   2 |    1 |
|     1 |   2 |    2 |
|     1 |   2 |    3 |
|     1 |   2 |    4 |
|     2 |   1 |    1 |
|     2 |   1 |    2 |
|     2 |   1 |    3 |
|     2 |   1 |    4 |
+-------+-----+------+
+-------+-----+------+-------+
| Month | Day | Hour | Block |
+-------+-----+------+-------+
|     1 |   1 |    1 | [1,2] |
|     1 |   1 |    2 | [1,2] |
|     1 |   1 |    3 | [3,4] |
|     1 |   1 |    4 | [3,4] |
|     1 |   2 |    1 | [1,2] |
|     1 |   2 |    2 | [1,2] |
|     1 |   2 |    3 | [3,4] |
|     1 |   2 |    4 | [3,4] |
|     2 |   1 |    1 | [1,2] |
|     2 |   1 |    2 | [1,2] |
|     2 |   1 |    3 | [3,4] |
|     2 |   1 |    4 | [3,4] |
+-------+-----+------+-------+
我想将按月份和日期因素进行削减,以实现这一目标

+-------+-----+------+
| Month | Day | Hour |
+-------+-----+------+
|     1 |   1 |    1 |
|     1 |   1 |    2 |
|     1 |   1 |    3 |
|     1 |   1 |    4 |
|     1 |   2 |    1 |
|     1 |   2 |    2 |
|     1 |   2 |    3 |
|     1 |   2 |    4 |
|     2 |   1 |    1 |
|     2 |   1 |    2 |
|     2 |   1 |    3 |
|     2 |   1 |    4 |
+-------+-----+------+
+-------+-----+------+-------+
| Month | Day | Hour | Block |
+-------+-----+------+-------+
|     1 |   1 |    1 | [1,2] |
|     1 |   1 |    2 | [1,2] |
|     1 |   1 |    3 | [3,4] |
|     1 |   1 |    4 | [3,4] |
|     1 |   2 |    1 | [1,2] |
|     1 |   2 |    2 | [1,2] |
|     1 |   2 |    3 | [3,4] |
|     1 |   2 |    4 | [3,4] |
|     2 |   1 |    1 | [1,2] |
|     2 |   1 |    2 | [1,2] |
|     2 |   1 |    3 | [3,4] |
|     2 |   1 |    4 | [3,4] |
+-------+-----+------+-------+

我想也许使用
by
tapply
可能是一种方法,但我不知道如何使用。

我们可以用
cut
为一天中的每个小时创建一个序列,并用括号代替偏执:

df1$Block <- cut(df1$Hour, c(1,seq(2,24, by=2)), include.lowest=TRUE)
df1$Block <- sub("(", "[", df1$Block, fixed=T)
df1
#    Month Day Hour Block
# 1      1   1    1 [1,2]
# 2      1   1    2 [1,2]
# 3      1   1    3 [2,4]
# 4      1   1    4 [2,4]
# 5      1   2    1 [1,2]
# 6      1   2    2 [1,2]
# 7      1   2    3 [2,4]
# 8      1   2    4 [2,4]
# 9      2   1    1 [1,2]
# 10     2   1    2 [1,2]
# 11     2   1    3 [2,4]
# 12     2   1    4 [2,4]

df1$Block请从R而不是难以复制的ascii表中发布代码,我想group by操作之一应该这样做
library(dplyr);df%>%group_by(月、日)%>%mutate(Block=cut(小时,4))
有关如何在R问题中提供数据的许多建议,请参阅。大多数情况下,只发布
dput(数据)
的输出是最好的选择。使用
cut(x,c(1,seq(2,24,by=2)),include.lowest=TRUE)
逐月逐日削减小时毫无意义。或者它们应该是随机的名字,比如x,y和z?