2016-02-29 33 views
5

La mia domanda è basata su questo question.R: popolamento e/o duplicazione di righe in base ad altre colonne

Ho un dato come di seguito. Voglio riempire le celle guardando prima verso il basso e poi guardando fino a quando il risultato è lo stesso. In caso di bom = A, voglio riempire le righe come mostrato. Ma in caso di bom = B, come la colonna type_p è diverso, voglio duplicare file e sentire gli spazi vuoti

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 

I dati finali che voglio è come sotto

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

La logica che voglio è la seguente. Per favore ricorda che i miei dati sono molto grandi e ho migliaia di valori in ogni colonna.

bom e ww colonne sono sempre popolati/compilato dati in entrata

  1. Controllare se una voce nella colonna bom ha più di 1 valore nella colonna type_p
  2. Se c'è solo 1 valore quindi riempire spazi vuoti nelle colonne type_p e ww prima guardando in basso e poi guardando in alto. In questo caso bom = A ha solo un valore in type_p (sub)
  3. Se una voce in bom di una colonna ha più di 1 valore univoco nella colonna type_p, quindi creare set aggiuntivi delle stesse righe di quel bom in modo tale che i set totali siano uguale a valori distinti nella colonna type_p per quel bom. In questo caso bom = B ha due valori in type_p (sub e pan)
  4. vuoti Fill in type_p e ww colonne di prima guardando in basso e poi guardando (guardare la fila fonte per riempire i valori)

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

Dopo il punto 3, il frame di dati sarà simile sotto

> 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

Questo è molto problema risolvibile, tuttavia il tuo esempio non segue la tua logica: devi essere molto più chiaro attorno al passaggio 3 in modo specifico e in che modo le righe vengono riempite in alto o in basso nel caso duplicato. Ti suggerisco di mostrare anche i fotogrammi intermedi nel tuo esempio (questo potrebbe aiutarti anche a risolvere il problema nella tua mente) – Chris

+0

Ho aggiunto l'aggiornamento 2. – user2543622

+0

Questo è quello che pensavo - quindi sembra che questo violi il principio del riempimento. La riga 8 dovrebbe essere "tim sub"? – Chris

risposta

3

Con tidyr e 01.234.520,789 mila, si potrebbe riuscire a fare qualcosa di vicino a quello che si mira

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 

Per ottenere quello che hai descritto (in questione e commentare), si potrebbe trattare BOM A & B separatamente:

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

in caso di distinta base A, non voglio ripetere le righe poiché entrambe le parti beta e lambda sono di tipo_c = sub. Ma in caso di Bom B, voglio avere righe ripetute perché part-tim e tom sono di tipo type_p - sub e pan. Anche in caso di ww, per B, non voglio ww = 4 in quanto non era il loro nei dati originali. A proposito: bom A e bom B non hanno alcuna relazione/sono indipendenti – user2543622

+0

è possibile trattare A e B separatamente? potresti avere il risultato che desideri, dal mio primo 'df', ' bind_rows ( df%>% filter (bom == "A"), df%>% filter (bom == "B")%>% completo (annidamento (bom, Part, type_p), ww)) ' – cderv

+0

si prega di modificare la risposta in modo che io possa accettarlo – user2543622