根据R

时间:2018-07-03 18:41:22

标签: r

假设我有以下数据框:

set.seed(1)
df <- data.frame("x" = 1:5, "y" = rnorm(5))

  x          y
1 1 -0.6264538
2 2  0.1836433
3 3 -0.8356286
4 4  1.5952808
5 5  0.3295078

我想按照x中的指示将每一行重复多次,如下所示:

   x          y
1  1 -0.6264538
2  2  0.1836433
3  2  0.1836433
4  3 -0.8356286
5  3 -0.8356286
6  3 -0.8356286
7  4  1.5952808
8  4  1.5952808
9  4  1.5952808
10 4  1.5952808
11 5  0.3295078
12 5  0.3295078
13 5  0.3295078
14 5  0.3295078
15 5  0.3295078

我该怎么做?虽然我更喜欢使用tidyverse解决方案,但我愿意接受任何其他建议。

5 个答案:

答案 0 :(得分:3)

我们可以使用rep复制数据帧的行,并使用times参数说明每行重复多少次。

df[rep(1:nrow(df), times = df$x), ]
    x          y
1   1 -0.6264538
2   2  0.1836433
2.1 2  0.1836433
3   3 -0.8356286
3.1 3 -0.8356286
3.2 3 -0.8356286
4   4  1.5952808
4.1 4  1.5952808
4.2 4  1.5952808
4.3 4  1.5952808
5   5  0.3295078
5.1 5  0.3295078
5.2 5  0.3295078
5.3 5  0.3295078
5.4 5  0.3295078

答案 1 :(得分:2)

使用dplyr

dplyr::slice(df, rep(1:n(), x))                # as per Sir Gregor's recommendation

或明确

dplyr::slice(df,rep(1:nrow(df), df$x))

答案 2 :(得分:0)

with(df,df[rep(1:nrow(df),x),])
    x          y
1   1 -0.6264538
2   2  0.1836433
2.1 2  0.1836433
3   3 -0.8356286
3.1 3 -0.8356286
3.2 3 -0.8356286
4   4  1.5952808
4.1 4  1.5952808
4.2 4  1.5952808
4.3 4  1.5952808
5   5  0.3295078
5.1 5  0.3295078
5.2 5  0.3295078
5.3 5  0.3295078
5.4 5  0.3295078

答案 3 :(得分:0)

df[ rep(seq_len(nrow(df)), df$x), ]

    x           y
1   1 -1.31142059
2   2 -0.09652492
2.1 2 -0.09652492
3   3  2.36971991
3.1 3  2.36971991
3.2 3  2.36971991
4   4  0.89062648
4.1 4  0.89062648
4.2 4  0.89062648
4.3 4  0.89062648
5   5 -0.25218316
5.1 5 -0.25218316
5.2 5 -0.25218316
5.3 5 -0.25218316
5.4 5 -0.25218316

好像我们几个人同时到达了...

答案 4 :(得分:0)

我最近发现dplyr::uncount()也会很好地工作:

dplyr::uncount(df, x)