Jestem nowy dla R i pracuję nad projektem pobocznym dla własnych celów. Mam dane (odtwarzalny dput tego jest w końcu na pytanie):Przekształcanie danych w R z "loginem" "wylogowaniem" razy
X datetime user state
1 1 2016-02-19 19:13:26 User1 joined
2 2 2016-02-19 19:21:18 User2 joined
3 3 2016-02-19 19:21:33 User1 joined
4 4 2016-02-19 19:35:38 User1 joined
5 5 2016-02-19 19:44:15 User1 joined
6 6 2016-02-19 19:48:55 User1 joined
7 7 2016-02-19 19:52:40 User1 joined
8 8 2016-02-19 19:53:15 User3 joined
9 9 2016-02-19 20:02:34 User3 joined
10 10 2016-02-19 20:13:48 User3 joined
19 637 2016-02-19 19:13:32 User1 left
20 638 2016-02-19 19:25:26 User1 left
21 639 2016-02-19 19:30:30 User2 left
22 640 2016-02-19 19:42:16 User1 left
23 641 2016-02-19 19:47:59 User1 left
24 642 2016-02-19 19:51:06 User1 left
25 643 2016-02-19 20:02:26 User3 left
chcę, żeby wyglądać tak:
user joined left
1 User1 2016-02-19 19:13:26 2016-02-19 19:13:32
2 User2 2016-02-19 19:21:18 2016-02-19 19:30:30
3 User3 2016-02-19 19:53:15 2016-02-19 20:02:26
4 User1 2016-02-19 19:21:33 2016-02-19 19:25:26
.
.
.
Patrzę na tidyr jak jest jakaś przekształcanie w oczywisty sposób, ale nie mogę zawinąć głowy, co trzeba zrobić. Czy jest to możliwe (bez pętli/ogromnych ilości kodu proceduralnego)? Problemem, którego nie potrafię zrozumieć, jest to, że nie ma sposobu, by wiedzieć, że konkretny "lewy" zapis powinien zostać dołączony do konkretnej "połączonej" płyty. Przykłady, które mogę znaleźć, obejmują statyczny miesiąc lub dzień, w którym gromadzone są inne wartości. Powinienem dodać, że niekoniecznie gwarantuje się, że wszystkie zapisy będą miały "lewą" wartość (użytkownik może nadal być "połączony").
Oto wyjście dput z próbki danych:
> dput(samp)
structure(list(X = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L,
11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 637L, 638L, 639L, 640L,
641L, 642L, 643L, 644L, 645L, 646L, 647L, 648L, 649L, 650L, 651L
), datetime = structure(c(1L, 3L, 4L, 7L, 9L, 11L, 13L, 14L,
16L, 18L, 21L, 22L, 23L, 26L, 27L, 30L, 32L, 33L, 2L, 5L, 6L,
8L, 10L, 12L, 15L, 17L, 19L, 20L, 24L, 25L, 28L, 29L, 31L), .Label = c("2016-02-19 19:13:26",
"2016-02-19 19:13:32", "2016-02-19 19:21:18", "2016-02-19 19:21:33",
"2016-02-19 19:25:26", "2016-02-19 19:30:30", "2016-02-19 19:35:38",
"2016-02-19 19:42:16", "2016-02-19 19:44:15", "2016-02-19 19:47:59",
"2016-02-19 19:48:55", "2016-02-19 19:51:06", "2016-02-19 19:52:40",
"2016-02-19 19:53:15", "2016-02-19 20:02:26", "2016-02-19 20:02:34",
"2016-02-19 20:13:38", "2016-02-19 20:13:48", "2016-02-19 20:42:27",
"2016-02-19 20:48:22", "2016-02-19 20:49:31", "2016-02-19 20:59:58",
"2016-02-19 21:06:20", "2016-02-19 21:10:43", "2016-02-19 21:11:13",
"2016-02-19 21:11:15", "2016-02-19 21:11:22", "2016-02-19 21:17:33",
"2016-02-19 22:02:45", "2016-02-19 22:05:18", "2016-02-19 22:05:37",
"2016-02-19 22:05:47", "2016-02-19 22:30:30"), class = "factor"),
user = structure(c(1L, 2L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L,
3L, 4L, 1L, 1L, 4L, 4L, 4L, 3L, 1L, 1L, 2L, 1L, 1L, 1L, 3L,
3L, 3L, 1L, 4L, 1L, 1L, 4L, 4L), .Label = c("User1", "User2",
"User3", "User4"), class = "factor"), state = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L), .Label = c("joined", "left"), class = "factor")), .Names = c("X",
"datetime", "user", "state"), class = "data.frame", row.names = c(NA,
-33L))
Trochę więcej info: można bezpiecznie założyć, że są odpowiednie "lewe" wartości dla wszystkich oprócz ostatniego "połączonego" rekordu (nie jest to prawdą w przykładowym zbiorze danych. Ograniczam prawdziwe dane do czegoś mniejszego, aby zamieścić tutaj). Wydaje się, że można wyciąć zbiór danych według użytkownika/statusu, a następnie porównać datę każdego użytkownika, aby rozwiązać ten problem. 'ts <-spread (test, stan, datetime)' dostaje zestaw danych przygotowany na wiele sposobów. –
Czy kolumna X ma znaczenie tutaj, np. jako numer kolejny? –
Nie, można go zignorować. –