R rep seq其中行数不是seq长度的倍数

时间:2012-08-06 13:42:12

标签: r seq rep

我有一个1666行的数据框。我想添加一个重复序列为1:5的列,以便与cut()一起使用来进行交叉验证。它看起来像这样:

   Y      x1       x2       Id1
   1      .15      3.6       1
   0      1.1      2.2       2
   0      .05      3.3       3
   0      .45      2.8       4
   1      .85      3.1       5
   1      1.01     2.9       1
  ...      ...     ...      ...

我尝试了以下两种方法,但收到错误消息,因为它似乎只以完整seq()参数的增量添加数字:

>   tr2$Id1 <- rep(seq(1,5,1), (nrow(tr2)/5))
Error in `$<-.data.frame`(`*tmp*`, "Id", value = c(1, 2, 3, 4, 5, 1, 2,  : 
  replacement has 1665 rows, data has 1666
>   tr2$Id1 <- rep(seq(1,5,1), (nrow(tr2)/5) + (nrow(tr2)%%5))
Error in `$<-.data.frame`(`*tmp*`, "Id", value = c(1, 2, 3, 4, 5, 1, 2,  : 
  replacement has 1670 rows, data has 1666

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

使用length.out的{​​{1}}参数。

以下是使用内置数据集汽车的示例。

rep()

添加分组列:

str(cars)
'data.frame':   50 obs. of  2 variables:
 $ speed: num  4 4 7 7 8 9 10 10 10 11 ...
 $ dist : num  2 10 4 22 16 10 18 26 34 17 ...

检查结果:

cars$group <- rep(1:3, length.out=50)

答案 1 :(得分:2)

像这样的东西?

df <- data.frame(rnorm(1666))
df$cutter <- rep(1:5, length.out=1666)

tail(df)
     rnorm.1666. cutter
1661  0.11693169      1
1662 -1.12508091      2
1663  0.25441847      3
1664 -0.06045037      4
1665 -0.17242921      5
1666 -0.85366242      1