假设我有以下数据框:
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解决方案,但我愿意接受任何其他建议。
答案 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)