2013-02-12 39 views
8

że mam te ramki dwóch danych:W R, Scalanie dwóch ramek danych, wypełnić dół półwyrobów

big.table <- data.frame("idx" = 1:100) 

small.table <- data.frame("idx" = sample(1:100, 10), "color" = sample(colors(),10)) 

Chcę połączyć je razem tak:

merge(small.table, big.table, by = "idx", all.y=TRUE) 

idx   color 
1  1   <NA> 
2  2   <NA> 
3  3   salmon2 
4  4   <NA> 
5  5   <NA> 
6  6   <NA> 
... 
20 20   <NA> 
21 21   <NA> 
22 22   blue4 
23 23   grey99 
24 24   <NA> 
25 25   <NA> 
26 26   <NA> 
... 

Teraz muszę wypełnij wartości w kolumnie "kolor" w dół tabeli, tak aby wszystkie NA były ustawione na wartości, które pojawiają się wcześniej w tabeli.

UWAGI: Problem dotyczy pliku dziennika wygenerowanego z programu komputerowego, a nie w żadnym standardowym formacie dziennika. Bloki linii w tym pliku dziennika należą do "procesu" określonego w pierwszym wierszu bloku. Wyciągnąłem informacje z odpowiednich wierszy pliku dziennika, z których większość należy do procesu, i utworzyłem tabelę danych zawierającą te informacje (numer linii, sygnatura czasowa itp.). Teraz muszę wypełnić tę tabelę nazwy procesów, które odpowiadają każdej linii z small.table, która ma numer wiersza.

Może nie być "procesu" (kolor w powyższym przykładzie) dla linii na górze tabeli big.table. Te wiersze powinny pozostać NA.

Po rozpoczęciu pierwszego "procesu", każda linia między linią początkową procesu a kolejną należy do pierwszego procesu. Po rozpoczęciu drugiego procesu każda linia między linią startową procesu a kolejną linią startową procesu należy do drugiego procesu. I tak dalej. Linie procesowe nigdy nie są tym samym numerem linii, co inne linie, które zebrałem w ramce danych pliku dziennika.

Mój plan to utworzenie pliku big.table, który będzie sekwencją wszystkich numerów wierszy dziennika i scalenie go z tabelą. Następnie mogę "wypełnić" nazwę procesu i połączyć dużą tabelę z plikiem dziennika, zachowując tylko plik dziennika z wszystkimi elementami dołączonymi do niego.

Jestem otwarty na inne podejścia.

Odpowiedz

13

Brzmi jak trzeba na.locf z pakietu zoo (skrót od ostatniej obserwacji przeniesionej):

library(zoo) 
tbl <- merge(small.table, big.table, by = "idx", all.y=TRUE) 
tbl$color2 <- na.locf(tbl$color,na.rm = FALSE) 
8

data.table rozwiązanie:

require(data.table) 
b <- data.table(big.table, key="idx") 
s <- data.table(small.table, key="idx") 
s[b, roll=T] 

#  idx   color 
# 1: 1    NA 
# 2: 2    NA 
# 3: 3    NA 
# 4: 4   blue3 
# 5: 5   blue3 
# 6: 6   blue3 
# 7: 7   blue3 
# 8: 8   blue3 
# 9: 9   blue3 
# 10: 10   blue3 
# 11: 11 navajowhite1 
# 12: 12 navajowhite1 
# . . . . 
Powiązane problemy