2017-08-01 3 views
1

Dplyr: wie jede Zeile zu wiederholen, basierend auf einer Folge von ganzen Zahlen (1: 3)dplyr duplizieren jede Zeile durch eine Folge

ich auf einem Register arbeite (etwa Belgien für exemple):

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

Die registery enthält 3 Seiten:

library(dplyr) 

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

Meine Ausgabe:

country page 
    belg  1 
    belg  2 
    belg  3 

Erwartetes Ergebnis: Jeder Register'pages enthält drei Zeilen (jede Zeile wiederholen, basierend auf einer Folge von ganzen Zahlen (1: 3))

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

Was ich versuche:

diese zu meinem dplyr des Hinzufügen Rohr:

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

Antwort

1

Eine weitere Möglichkeit ist paste als String und dann mit separate_rows spaltete die Reihen

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

Sie können eine Liste erstellen, die Spalte 1 enthält: UNNEST es jeweils 3 und dann:

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

Große Antworten Psidom. Sehr hilfreich. – Wilcar

+0

Froh, dass es hilft! – Psidom

Verwandte Themen