2017-08-01 61 views
1

Dplyr複製的每一行:如何基於整數序列重複每一行(1:3)dplyr由序列

我工作的一個寄存器(約比利時爲例):

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

登記中心包含3頁:

library(dplyr) 

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

我的輸出:

country page 
    belg  1 
    belg  2 
    belg  3 

預期結果: 每個Register'pages包含三個行(重複基於整數(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的每個然後UNNEST它:

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