2016-07-07 19 views
4

Ich habe Probleme mit der Wiederholung von Zeilen meiner realen Daten mit dplyr. Es gibt bereits einen anderen Eintrag hier repeat-rows-of-a-data-frame aber keine Lösung für dplyr.Wiederholte Zeilen von data.frame in dplyr

Hier Ich frage mich nur, wie die Lösung für dplyr sein könnte, aber fehlgeschlagen mit Fehler:

Error: wrong result size (16), expected 4 or 1

library(dplyr) 
    df <- data.frame(column = letters[1:4]) 

    df_rep <- df%>% 
     mutate(column=rep(column,each=4)) 

Erwartete Ausgabe

>df_rep 
    column 
    #a 
    #a 
    #a 
    #a 
    #b 
    #b 
    #b 
    #b 
    #* 
    #* 
    #* 
+1

Der einzige Weg, an den ich denken kann, besteht darin, in einen do-Block zu pipe- ren und aus dem aktuellen data.frame einen neuen zu erzeugen, wie Sie wollen (df%>% do (data.frame (column = rep (. $ Spalte, 4))) '). Dies ist jedoch gefährlich, wenn der data.frame andere Spalten hat. – r2evans

+0

@ r2evans funktioniert super. Sie können es als Antwort senden. muss nur 'do (data.frame (a = rep (. $ a, each = 4)))' 'ändern. – Alexander

Antwort

2

Dies ist mit der Gefahr rife, wenn die data.frame hat andere Spalten (dort habe ich es gesagt!), aber der do Block ermöglicht es Ihnen, einen abgeleiteten data.frame innerhalb einerzu generierenRohr (obwohl Ceci n'est pas un Rohr):

library(dplyr) 
df <- data.frame(column = letters[1:4], stringsAsFactors = FALSE) 
df %>% 
    do(data.frame(column = rep(.$column, each = 4), stringsAsFactors = FALSE)) 
# column 
# 1  a 
# 2  a 
# 3  a 
# 4  a 
# 5  b 
# 6  b 
# 7  b 
# 8  b 
# 9  c 
# 10  c 
# 11  c 
# 12  c 
# 13  d 
# 14  d 
# 15  d 
# 16  d 
+17

Meiner Erfahrung nach ist 'do' sehr langsam. Sie können 'slice' wie' df%>% slice (rep (1: n(), jeweils = 4)) ''. Dies behandelt auch den Fall von mehr Spalten. – Frank

+2

Schöne Alternative, und es ist sicherlich eleganter. Ich versuchte so etwas zu finden, aber mein Gehirn rebellierte. Danke, Frank! (Und ich stimme zu, "do" tendiert dazu, die Dinge niederzureißen, ein bekannter Flaschenhals.) – r2evans

1

Ich war auf der Suche nach einer ähnlichen (aber etwas anders) Lösung. Hier zu posten, falls es für andere nützlich ist.

In meinem Fall brauchte ich eine allgemeinere Lösung, mit der jeder Buchstabe beliebig oft wiederholt werden kann. Hier ist, was ich kam mit:

library(tidyverse) 

df <- data.frame(letters = letters[1:4]) 
df 

> df 
    letters 
1  a 
2  b 
3  c 
4  d 

Sagen wir, ich möchte 2 a, 3 B, 2 c und 4 D's:

df %>% 
    mutate(count = c(2, 3, 2, 4)) %>% 
    group_by(letters) %>% 
    expand(count = seq(1:count)) 

# A tibble: 11 x 2 
# Groups: letters [4] 
    letters count 
    <fctr> <int> 
1  a  1 
2  a  2 
3  b  1 
4  b  2 
5  b  3 
6  c  1 
7  c  2 
8  d  1 
9  d  2 
10  d  3 
11  d  4 

Wenn Sie nicht möchten, dass die Zählspalte halten:

df %>% 
    mutate(count = c(2, 3, 2, 4)) %>% 
    group_by(letters) %>% 
    expand(count = seq(1:count)) %>% 
    select(letters) 

# A tibble: 11 x 1 
# Groups: letters [4] 
    letters 
    <fctr> 
1  a 
2  a 
3  b 
4  b 
5  b 
6  c 
7  c 
8  d 
9  d 
10  d 
11  d 

Wenn Sie wollen, dass die Zählung die Anzahl der Male zu reflektieren jeden Buchstaben wiederholt:

df %>% 
    mutate(count = c(2, 3, 2, 4)) %>% 
    group_by(letters) %>% 
    expand(count = seq(1:count)) %>% 
    mutate(count = max(count)) 

# A tibble: 11 x 2 
# Groups: letters [4] 
    letters count 
    <fctr> <dbl> 
1  a  2 
2  a  2 
3  b  3 
4  b  3 
5  b  3 
6  c  2 
7  c  2 
8  d  4 
9  d  4 
10  d  4 
11  d  4 
Verwandte Themen