Mam datatable z wieloma wierszami i chciałbym warunkowo grupować dwie kolumny, a mianowicie Begin i End. Te kolumny oznaczają pewien miesiąc, w którym osoba powiązana coś robiła. Oto przykładowe dane (można użyć R, aby czytać, albo znaleźć czystych tabele poniżej, jeśli nie używać R):Grupa kolejnych zakresów
# base:
test <- read.table(
text = "
1 A mnb USA prim 4 12
2 A mnb USA x 13 15
3 A mnb USA un 16 25
4 A mnb USA fdfds 1 2
5 B ghf CAN sdg 3 27
6 B ghf CAN hgh 28 29
7 B ghf CAN y 24 31
8 B ghf CAN ghf 38 42
",header=F)
library(data.table)
setDT(test)
names(test) <- c("row","Person","Name","Country","add info","Begin","End")
out <- read.table(
text = "
1 A mnb USA fdfds 1 2
2 A mnb USA - 4 25
3 B ghf CAN - 3 31
4 B ghf CAN ghf 38 42
",header=F)
setDT(out)
names(out) <- c("row","Person","Name","Country","add info","Begin","End")
Grupowanie powinno odbywać się w sposób następujący: Jeżeli osoba A nie wędrować od 4. miesiąca do 15 miesiąca i podróżując od 16 do 24 miesiąca, grupowałbym kolejną (tj. bez przerwy) aktywność od 4 do 24 miesiąca. Jeśli później osoba A surfowała od 25 miesiąca do 28 miesiąca, dodałabym też to i cała działalność grupy potrwałaby od 4 do 28. Teraz problematyczne są przypadki, w których dochodzi do nakładania się okresów, na przykład osoba A może również łowić ryby od 11 do 31, więc całość będzie wynosić od 4 do 31. Jednakże, jeśli osoba A zrobił coś od 1 do 2, co byłoby odrębnym działaniem (w porównaniu z 1 do 3, co też musiałoby być dodano, ponieważ 3 jest połączone z 4). Mam nadzieję, że było jasne, jeśli nie możesz znaleźć więcej przykładów w powyższym kodzie. Używam datatable, ponieważ mój zbiór danych jest dość duży. Zacząłem od sqldf do tej pory, ale problematyczne jest, jeśli masz tak wiele działań na osobę (powiedzmy 8 lub więcej). Czy można to zrobić w datatable, plyr lub sqldf? Uwaga: również szukam odpowiedzi w SQL, ponieważ mógłbym użyć tego bezpośrednio w sqldf lub spróbować przekonwertować go na inny język. sqldf obsługuje (1) bazę danych SQLite (domyślnie), (2) bazę danych H2 java, (3) baza danych PostgreSQL i (4) sqldf 0.4-0 dalej obsługuje również MySQL.
Edycja: Oto 'czysty' tabel:
W:
Person Name Country add info Begin End
A mnb USA prim 4 12
A mnb USA x 13 15
A mnb USA un 16 25
A mnb USA fdfds 1 2
B ghf CAN sdg 3 27
B ghf CAN hgh 28 29
B ghf CAN y 24 31
B ghf CAN ghf 38 42
Out:
A mnb USA fdfds 1 2
A mnb USA - 4 25
B ghf CAN - 3 31
B ghf CAN ghf 38 42
Zobacz [Przerwy między pakietami] (http://blogs.solidq.com/en/sqlserver/packing-intervals/) Itzika Ben-Gana. Korzysta z SQL Server, ale najnowsze wersje Postgrera obsługują funkcje tego samego okna co najnowszy SQL Server, więc powinno być proste dostosowanie jego kodu SQL do PostgreSQL. W szczególności zobacz ostatnie rozwiązanie 3 przy użyciu agregatora okien. –
Ty też to sprawdzi – user3032689
Dla rozwiązania R, [ten post] (http://stackoverflow.com/questions/16957293/collapse-intersecting-regions-in-r) wydaje się mieć znaczenie. – Henrik