Преобразовать данные многоступенчатых событий в продольные данные в r - PullRequest
0 голосов
/ 05 октября 2018

У меня есть набор данных о продвижении по службе.Для каждого человека у меня есть точные данные о том, когда они были наняты компанией, повышены в должности и покинули компанию.У меня также есть несколько характеристик.Я использую r.

SubjectID Entry     Stage1    Stage2    Stage3    Stage4   Exit     Race  Edu
   1      1/12/1990 1/12/1990 1/12/1990  4/3/1994          5/5/1994 B     M
   2      1/17/1991 1/17/1991 3/3/1991   3/18/1992 1/1/1993         W     C 
   3      1/24/1991 1/24/1991 5/6/1994                              B     M

Я хотел бы преобразовать эти данные в длинный продольный набор данных, где каждая дата сообщает этап, на котором находится индивидуум, а также сообщает характеристики, не зависящие от времени.У меня есть дата окончания 1 января 1995 года, после которой никаких наблюдений не происходит.Я посмотрел в пакет изменения формы, но он не имеет то, что мне нужно.

Мои данные:

структура (список (İ..Name = структура (c (2L, 1L, 4L, 3L)), .Label = c ("Ademulegun, Sauel Adesujo""," Bassey, Wellington Umo "," Imo, UO "," Lawan, Umar "), class =" factor "), Mons = c (0L, 0L, 0L, 0L), Sandhurst = c (0L, 0L,1L, 0L), Entry = структура (c (2L, 3L, 1L, 4L), .Label = c («6/6/1953», «30.04.1949», «6/11/1949», «04.06.1955 "), class =" factor "), Second.Luutenant = структура (c (2L, 3L, 1L, 4L), .Label = c (" 2/6/1953 "," 4/30 /1949 "," 6/11/1949 "," 6/6/1955 "), класс =" фактор "), лейтенант = структура (c (2L, 1L, 4L, 3L), .Label = c (" 12 /20/1949 "," 30.04.1949 "," 3.05.1958 "," 01.08.1955 "), класс =" фактор "), капитан = структура (c (2L, 3L, 1L, 4L), .Label = c ("", "2/7/1951", "3/5/1952", "5/3/1958"), class = "factor"), Major = структура (c (4L,3L, 1L, 2L), .Label = c ("", "15.01.1963", "27.12.1958", "21.06.1957"), class = "factor"), лейтенант. Полковник= структура (c (4L, 3L, 1L, 2L), .Label = c ("", "15.01.1963", "03.10.1962", "30.08.1962"), класс = "фактор "), полковник = структураture (c (3L, 2L, 1L, 1L), .Label = c ("", "10/3/1962", "26.02.1966"), class = "factor"), Brigadier.General = структура(c (3L, 2L, 1L, 1L), .Label = c ("", "10/3/1962", "26.02.1966"), class = "factor"), Depature = структура (c (2L, 1L, 3L, 4L), .Label = c ("15.01.1966", "01.11.1966", "05.08.1956", "06.06.1967"), класс = "фактор "), этническая принадлежность = структура (c (1L, 4L, 3L, 2L), .Label = c (" Efik "," Igbo "," Kanuri "," Yoruba "), class =" factor ")), класс= "data.frame", row.names = c (NA, -4L))

Я ищу что-то вроде этого:

Name  Date       Mons Sandhurst Ethnicity Rank
Bassey 4/30/1949  0     0       Efik      Lieutenant
Bassey 5/1/1949   0     0       Efik      Lieutenant
....
Bassey 2/7/1951   0     0       Efik      Captain

1 Ответ

0 голосов
/ 05 октября 2018

data.table решение

library(data.table)

пример данных

df <- structure(list(Name = structure(c(2L, 1L, 4L, 3L), .Label = c("Ademulegun, Sauel Adesujo", "Bassey, Wellington Umo", "Imo, U. O.", "Lawan, Umar"), class = "factor"), Mons = c(0L, 0L, 0L, 0L), Sandhurst = c(0L, 0L, 1L, 0L), Entry = structure(c(2L, 3L, 1L, 4L), .Label = c("2/6/1953", "4/30/1949", "6/11/1949", "6/4/1955"), class = "factor"), Second.Lieutenant = structure(c(2L, 3L, 1L, 4L), .Label = c("2/6/1953", "4/30/1949", "6/11/1949", "6/4/1955"), class = "factor"), Lieutenant = structure(c(2L, 1L, 4L, 3L), .Label = c("12/20/1949", "4/30/1949", "5/3/1958", "8/1/1955"), class = "factor"), Captain = structure(c(2L, 3L, 1L, 4L), .Label = c("", "2/7/1951", "3/5/1952", "5/3/1958"), class = "factor"), Major = structure(c(4L, 3L, 1L, 2L), .Label = c("", "1/15/1963", "12/27/1958", "6/21/1957" ), class = "factor"), Lieutenant.Colonel = structure(c(4L, 3L, 1L, 2L), .Label = c("", "1/15/1963", "10/3/1962", "8/30/1962" ), class = "factor"), Colonel = structure(c(3L, 2L, 1L, 1L ), .Label = c("", "10/3/1962", "2/26/1966"), class = "factor"), Brigadier.General = structure(c(3L, 2L, 1L, 1L), .Label = c("", "10/3/1962", "2/26/1966"), class = "factor"), Depature = structure(c(2L, 1L, 3L, 4L), .Label = c("1/15/1966", "11/1/1966", "5/8/1956", "7/6/1967"), class = "factor"), ethnicity = structure(c(1L, 4L, 3L, 2L), .Label = c("Efik", "Igbo", "Kanuri", "Yoruba" ), class = "factor")), class = "data.frame", row.names = c(NA, -4L))

изменить с использованием data.tables fast melt

library( data.table )

data.table::melt( data = setDT( df ),
                  id.vars = c("Name", "Mons", "Sandhurst", "ethnicity" ),
                  value.name = "Date",
                  variable.name = "Rank",
                  na.rm = TRUE )

результат

#                         Name Mons Sandhurst ethnicity               Rank       Date
# 1:    Bassey, Wellington Umo    0         0      Efik              Entry  4/30/1949
# 2: Ademulegun, Sauel Adesujo    0         0    Yoruba              Entry  6/11/1949
# 3:               Lawan, Umar    0         1    Kanuri              Entry   2/6/1953
# 4:                Imo, U. O.    0         0      Igbo              Entry   6/4/1955
# 5:    Bassey, Wellington Umo    0         0      Efik  Second.Lieutenant  4/30/1949
# 6: Ademulegun, Sauel Adesujo    0         0    Yoruba  Second.Lieutenant  6/11/1949
# 7:               Lawan, Umar    0         1    Kanuri  Second.Lieutenant   2/6/1953
# 8:                Imo, U. O.    0         0      Igbo  Second.Lieutenant   6/4/1955
# 9:    Bassey, Wellington Umo    0         0      Efik         Lieutenant  4/30/1949

изменить порядок по мере необходимости ...

примечание: Если вы хотите «пустой»Даты исчезают в расплавленных данных, убедитесь, что в исходных данных заданы значения NA в пустых датах. na.rm = TRUE в функции плавления, затем удалите их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...