2016-02-29 8 views
5

Meine Frage basiert auf dieser question.R: Füllen und/oder Duplizieren von Zeilen basierend auf anderen Spalten

Ich habe Daten wie folgt. Ich möchte die Zellen füllen, indem ich zuerst nach unten schaue und dann nach oben schaue, solange die Person gleich ist. Im Falle von bom = A möchte ich die Zeilen wie gezeigt ausfüllen. Aber im Fall von bom = B, da die type_p Spalte unterschiedlich ist, mag ich Zeilen kopieren und das Gefühl, die Rohlinge

bom=c(rep("A",4),rep("B",3)) 
Part=c("","lambda","beta","","tim","tom","") 
type_p=c("","sub","sub","","sub","pan","") 
ww=c(1,2,3,4,1,2,3) 
df=data.frame(bom,Part,type_p,ww) 

> df 
    bom Part type_p ww 
1 A    1 
2 A lambda sub 2 
3 A beta sub 3 
4 A    4 
5 B tim sub 1 
6 B tom pan 2 
7 B    3 

Die endgültigen Daten, die ich will, sind, wie unten

bom Part type_p ww 
1 A lambda sub  1 
2 A lambda sub  2 
3 A beta sub  3 
4 A beta sub  4 
5 B tim  sub  1 
6 B tim  sub  2 
7 B tim  sub  3 
5 B tom  pan  1 
6 B tom  pan  2 
7 B tom  pan  3 

________________________________________Update 1

Die Logik, die ich möchte, ist wie folgt. Bitte denken Sie daran, dass meine Daten sehr groß sind und ich Tausende von Werten in jeder Spalte habe.

bom und ww Spalten werden immer bevölkert/in eingehenden Daten gefüllt

  1. Überprüfen Sie, ob ein Eintrag in der Spalte bom mehr als 1 Wert in der Spalte type_p
  2. hat Wenn es nur 1-Wert ist dann Leerstellen füllen in den Spalten type_p und ww, indem zuerst nach unten und dann nach oben geschaut wird. In diesem Fall hat bom = A nur einen Wert in type_p (sub)
  3. Wenn ein Eintrag in der Spalte bom mehr als 1 eindeutigen Wert in der Spalte type_p hat, dann erstellen Sie weitere Sätze der gleichen Zeilen des bom, so dass die Gesamtsätze werden gleich verschiedenen Werten in der Spalte type_p für diesen bom. In diesem Fall bom = B hat zwei Werte in type_p (Unter- und pan)
  4. Fill-Rohlinge in type_p und ww Spalten, indem zuerst blickte nach unten und dann oben schaut (Blick auf die Quellzeile Werte aufzufüllen)

================================================= =========== Update 2

Nach Schritt 3 würde der Datenrahmen aussehen wie unten

> df 
    bom Part type_p ww 
1 A lambda sub 1 
2 A lambda sub 2 
3 A beta sub 3 
4 A beta sub 4 
5 B tim sub 1 
6 B    2 
7 B    3 
8 B    1 
9 B tom pan 2 
10 B    3 
+0

Dies ist ein sehr lösbares Problem, aber Ihr Beispiel folgt nicht Ihrer Logik - Sie müssen um Schritt 3 genauer wissen, und wie Zeilen im duplizierten Fall aufgefüllt werden. Ich würde vorschlagen, in Ihrem Beispiel auch Zwischendatenrahmen zu zeigen (das könnte Ihnen auch helfen, das Problem in Ihrem Kopf zu lösen) – Chris

+0

Ich habe Update 2 hinzugefügt. – user2543622

+0

Das ist, was ich dachte - so scheint es, als verstößt dies gegen Ihr Prinzip. Sollte Zeile 8 nicht "Tim Sub" sein? – Chris

Antwort

3

Mit tidyr und dplyr, könnte man schaffen, etwas in der Nähe zu tun, was Sie wollen

library(tidyr) 
library(dplyr) 
# replacing empty string with NA 
df <- df %>% mutate_each(funs(sub("^$", NA, .)), Part, type_p) 
# filling missing values 
df <- df %>% fill(Part, type_p,.direction = "down") %>% fill(Part, type_p,.direction = "up") 

df 
#> bom Part type_p ww 
#> 1 A lambda sub 1 
#> 2 A lambda sub 2 
#> 3 A beta sub 3 
#> 4 A beta sub 4 
#> 5 B tim sub 1 
#> 6 B tom pan 2 
#> 7 B tom pan 3 

zu erhalten, was Sie (in Frage und Kommentar) beschrieben, können Sie BOM A & B separat behandeln:

bind_rows(
    df %>% filter(bom == "A"), 
    df %>% filter(bom == "B") %>% 
    complete(nesting(bom, Part, type_p), ww) 
) 
#> Source: local data frame [10 x 4] 
#> 
#>  bom Part type_p ww 
#> (fctr) (chr) (chr) (dbl) 
#> 1  A lambda sub  1 
#> 2  A lambda sub  2 
#> 3  A beta sub  3 
#> 4  A beta sub  4 
#> 5  B tim sub  1 
#> 6  B tim sub  2 
#> 7  B tim sub  3 
#> 8  B tom pan  1 
#> 9  B tom pan  2 
#> 10  B tom pan  3 
+0

im Falle von BOM A, ich möchte Reihen nicht wiederholen, da beide Teile Beta und Lambda von type_c = sub sind. Aber im Fall von "B" möchte ich Wiederholungszeilen haben, weil "Teilzeit" und "Tom" unterschiedlich typ_p - sub und pan sind. Auch im Falle von ww, für B, ich will nicht ww = 4, da es nicht in ihren ursprünglichen Daten war. FYI: bom A und bom B haben überhaupt keine Beziehung/sie sind unabhängig – user2543622

+0

ist es möglich, A und B getrennt zu behandeln? Sie könnten das gewünschte Ergebnis haben, von meinem ersten 'df', ' bind_rows ( df%>% filter (bom == "A"), df%>% filter (bom == "B")%>% complete (nesting (bom, Part, type_p), ww)) ' – cderv

+0

Bitte ändere deine Antwort so, dass ich sie akzeptieren kann – user2543622