Powiedz, że mam dane dotyczące osób, które wybierają kilka opcji. Mam jeden wiersz na osobę i chcę mieć jeden wiersz na osobę i opcję wyboru. Tak więc, jeśli mam 10 osób, które mają 3 opcje, teraz mam 10 wierszy i chcę mieć 30Jak używać tidyr do wypełniania wypełnionych wierszy w ramach każdej wartości zmiennej grupującej?
Wszystkie pozostałe zmienne powinny zostać skopiowane do każdego z nowych wierszy. Na przykład, jeśli mam zmienną dotyczącą płci, powinna ona być stała w ramach identyfikatora. (Mam ustawienie moich danych aż ten sposób analizować z mnlogit
.)
To wydaje się sytuacja, że dwie tidyr
funkcje complete
i fill
, zostały zaprojektowane. Aby wykorzystać prosty przykład
library(lubridate)
library(tidyr)
dat <- data.frame(
id = 1:3,
choice = 5:7,
c = c(9, NA, 11),
d = ymd(NA, "2015-09-30", "2015-09-29")
)
dat %>%
complete(id, choice) %>%
fill(everything())
# Source: local data frame [9 x 4]
#
# id choice c d
# (int) (int) (dbl) (time)
# 1 1 5 9 <NA>
# 2 1 6 9 <NA>
# 3 1 7 9 <NA>
# 4 2 5 9 <NA>
# 5 2 6 9 2015-09-30
# 6 2 7 9 2015-09-30
# 7 3 5 9 2015-09-30
# 8 3 6 9 2015-09-30
# 9 3 7 11 2015-09-29
to jednak pewne problemy - wartości D przeniesiono poprawnie, ale wartości C identyfikatora 1 otrzymuje (poprawne) brak wartości dla ID 2.
Mogę wypróbować obejście, na przykład zastąpienie wszystkich brakujących wartości 999, uruchamianie complete
i fill
, a następnie zastąpienie 999 NA. (Myślę, że musiałbym przekonwertować zmienne daty na zmienne znakowe, a następnie przekonwertować je ponownie, jeśli pójdę tą drogą.) Ale może ktoś tutaj zna czysty sposób na zrobienie tego z tidyr
?
Edit: sygnał wyjściowy jest tutaj:
# Source: local data frame [9 x 4]
#
# id c d choice
# (int) (dbl) (time) (int)
# 1 1 9 <NA> 5
# 2 1 9 <NA> 6
# 3 1 9 <NA> 7
# 4 2 NA 2015-09-30 5
# 5 2 NA 2015-09-30 6
# 6 2 NA 2015-09-30 7
# 7 3 11 2015-09-29 5
# 8 3 11 2015-09-29 6
# 9 3 11 2015-09-29 7
Niestety, 'time' ma być' wyborem'. Naprawię to. –
Jako aktualizacja, 'mlogit' zawiera funkcję,' mlogit.data', która rozwiązuje ten problem. 'mlogit.data (dat, choice =" choice ", shape =" wide ")' również daje pożądane wyniki. Wiem, że poprosiłem o rozwiązanie 'tidyr', ale dla przyszłych czytelników pomyślałem, że pomocne może być również włączenie tego rozwiązania. –