2016-08-12 4 views
1

Ich habe Probleme beim Kombinieren slice und map.R - dplyr Map Slice für Wiederholungszeilen

Ich bin daran interessiert, etwas zu tun, ähnlich wie this; Das ist in meinem Fall, eine kompakte Person-Periode-Datei in eine lange (sequenzielle) Personen-Periode zu verwandeln. Da meine Datei jedoch zu groß ist, muss ich die Daten zuerst teilen.

Aussehen Meine Daten wie diese

group id var ep dur 
1  A 1 a 1 20 
2  A 1 b 2 10 
3  A 1 a 3 5 
4  A 2 b 1 5 
5  A 2 b 2 10 
6  A 2 b 3 15 
7  B 1 a 1 20 
8  B 1 a 2 10 
9  B 1 a 3 10 
10  B 2 c 1 20 
11  B 2 c 2 5 
12  B 2 c 3 10 

Was ich brauche ist einfach diese (Antwort von this)

library(dplyr) 
dt %>% slice(rep(1:n(),.$dur)) 

aber ich bin daran interessiert, eine split(.$group) einzuführen.

Wie soll ich das tun?

dt %>% split(.$group) %>% map_df(slice(rep(1:n(),.$dur))) 

Funktioniert nicht zum Beispiel.

Meine gewünschte Ausgabe ist die gleiche wie dt %>% slice(rep(1:n(),.$dur)) die

 group id var ep dur 
1  A 1 a 1 20 
2  A 1 a 1 20 
3  A 1 a 1 20 
4  A 1 a 1 20 
5  A 1 a 1 20 
6  A 1 a 1 20 
7  A 1 a 1 20 
8  A 1 a 1 20 
9  A 1 a 1 20 
10  A 1 a 1 20 
..... 

ist Aber ich muss split diese Operation, da die Datei zu groß ist.

Daten

dt = structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
id = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 
2L, 2L), .Label = c("1", "2"), class = "factor"), var = structure(c(1L, 
2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 3L, 3L, 3L), .Label = c("a", 
"b", "c"), class = "factor"), ep = structure(c(1L, 2L, 3L, 
1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("1", "2", 
"3"), class = "factor"), dur = c(20, 10, 5, 5, 10, 15, 20, 
10, 10, 20, 5, 10)), .Names = c("group", "id", "var", "ep", 
"dur"), row.names = c(NA, -12L), class = "data.frame") 
+2

Nicht sicher, warum es downvoted wurde, das sieht wie eine interessante Frage aus (plus eins) – akrun

+0

Ich bin nicht klar, was das OP als Ausgabe erwartet (obwohl ich überhaupt nicht darüber abgestimmt habe) – hrbrmstr

+0

@hrbrmstr denke ich Es ist das gleiche wie im verlinkten Post – akrun

Antwort

3

map nimmt zwei Argumente: einen Vektor/list in .x und eine Funktion in .f. Es gilt dann .f für alle Elemente in .x.

Die Funktion, die Sie an map übergeben, ist nicht korrekt formatiert. Versuchen Sie folgendes:

Dieses Mal werden Sie direkt übergeben Sie die slice Funktion map mit zusätzlichen Parametern:

f <- function(x) x %>% slice(rep(1:n(), .$dur)) 
dt %>% 
    split(.$group) %>% 
    map_df(f) 

Sie auch es so verwenden könnte.

1

Ich bin nicht ganz sicher, was Ihre gewünschte endgültige Ausgabe ist, aber Sie könnten tidyr verwenden, um die Daten zu verschachteln, die Sie wiederholen möchten, und eine einfache Funktion zum Erweitern der Ebenen Ihrer verschachtelten Daten, sehr ähnlich zu Tutuchan's Antwort.

expand_df <- function(df, repeats) { 
    df %>% slice(rep(1:n(), repeats)) 
} 

dt %>% 
    tidyr::nest(var:ep) %>% 
    mutate(expanded = purrr::map2(data, dur, expand_df)) %>% 
    select(-data) %>% 
    tidyr::unnest() 

Tutuchans Antwort gibt genau die gleiche Ausgabe wie Ihre ursprüngliche Herangehensweise - ist das wonach Sie gesucht haben? Ich weiß nicht, ob es einen Vorteil gegenüber Ihrer ursprünglichen Methode haben wird.