2017-08-01 13 views
1

Dplyrで各行を複製:整数の配列に基づいて、各行を繰り返す方法(1:3)dplyrはシーケンス

私は(exempleのためにベルギー程度)レジスタに取り組んでいます:

country<- c("belg") 
country <- as.data.frame(country) 

library(dplyr) 

country2 <- country %>% 
    slice(rep(1:n(), each=3)) %>% 
    mutate(pages = row_number()) 

マイ出力:

country page 
    belg  1 
    belg  2 
    belg  3 

registeryは3ページが含まれています3210

期待される結果: 各Register'pagesは3行が含まれています(整数(1の配列に基づいて、各行を繰り返し:3))私が試した何

country page row_id 
    belg  1 1 
    belg  1 2 
    belg  1 3 
    belg  2 1 
    belg  2 2 
    belg  2 3 
    ... 

は私dplyr年代にこれを追加しますパイプ:

 %>% 
    group_by(pages) %>% 
    mutate(row_id = seq(1:3)) %>% 
    ungroup() 

答えて

1

別のオプションは、文字列としてpasteにあり、その後でseparate_rowsは行

library(tidyverse) 
df %>% 
    mutate(row_id = toString(seq_len(3))) %>% 
    separate_rows(row_id) 
# country page row_id 
#1 belg 1  1 
#2 belg 1  2 
#3 belg 1  3 
#4 belg 2  1 
#5 belg 2  2 
#6 belg 2  3 
#7 belg 3  1 
#8 belg 3  2 
#9 belg 3  3 
4

あなたが1含まれているリストの列を作成することができます:3それぞれをし、それアンネスト:

library(dplyr); library(tidyr) 
df %>% mutate(row_id = list(seq_len(3))) %>% unnest() 

# country page row_id 
#1 belg 1  1 
#2 belg 1  2 
#3 belg 1  3 
#4 belg 2  1 
#5 belg 2  2 
#6 belg 2  3 
#7 belg 3  1 
#8 belg 3  2 
#9 belg 3  3 

dput(df) 
structure(list(country = structure(c(1L, 1L, 1L), .Label = "belg", class = "factor"), 
    page = 1:3), .Names = c("country", "page"), class = "data.frame", row.names = c(NA, 
-3L)) 
+0

グレート回答のPsidomを分割します。非常に役立ちます。 – Wilcar

+0

うれしい! – Psidom