Reputation: 351
I am conducting a longitudinal analysis with data in long format. I have personality (O, C, E, A, N) measured in 2005, 2009 and 2013 with my dependent variable (job satisfaction) measured every year. Each person has their own ID. I have two goals (which I think might be able to be achieved with the same underlying logic):
1) I need another variable (column) indicating the first year that personality was measured for each person. If personality was never measured, then return NA. For example, if personality was first measured in 2009, then “2009” needs to be returned in this column for every row for that ID.
2) I need another variable (column) which copies the personality item responses for each year for each ID, unless it is replaced by a later measurement year (i.e. 2009, 2013). For example, if an ID completed the personality test in 2005 and 2009, then I need their responses for 2005 copied to years 2006, 2007, and 2008, but not 2009, as later entries (if they exist) should then become what gets copied forward to future years.
I have tried making a function for these, but ultimately failed.
I hope that makes sense. Extract of 100 cases below:
structure(list(Person_ID = c(100003L, 100003L, 100003L, 100003L,
100003L, 100003L, 100003L, 100003L, 100003L, 100003L, 100005L,
100005L, 100005L, 100005L, 100005L, 100005L, 100005L, 100005L,
100005L, 100006L, 100006L, 100006L, 100006L, 100006L, 100006L,
100006L, 100006L, 100007L, 100007L, 100007L, 100007L, 100007L,
100008L, 100008L, 100008L, 100009L, 100009L, 100010L, 100010L,
100010L, 100010L, 100010L, 100010L, 100010L, 100010L, 100010L,
100010L, 100011L, 100011L, 100011L, 100011L, 100011L, 100014L,
100014L, 100014L, 100014L, 100014L, 100014L, 100014L, 100014L,
100014L, 100014L, 100015L, 100015L, 100015L, 100015L, 100015L,
100015L, 100015L, 100015L, 100015L, 100015L, 100016L, 100016L,
100016L, 100016L, 100016L, 100016L, 100016L, 100016L, 100016L,
100016L, 100018L, 100018L, 100018L, 100018L, 100018L, 100018L,
100018L, 100018L, 100018L, 100018L, 100019L, 100019L, 100019L,
100019L, 100019L, 100019L, 100019L, 100019L), Job_Satisfaction = c(0L,
NA, 7L, NA, 8L, 10L, NA, NA, NA, NA, 9L, NA, NA, NA, NA, NA,
NA, NA, NA, 6L, 10L, 8L, 9L, 7L, NA, 9L, 3L, NA, 10L, NA, NA,
NA, NA, NA, NA, NA, NA, 5L, NA, NA, NA, NA, 5L, 4L, 8L, 5L, 5L,
NA, NA, NA, 8L, NA, 8L, 6L, 8L, 7L, 7L, NA, NA, NA, NA, NA, 10L,
9L, 9L, 9L, 10L, 8L, 10L, 9L, 8L, 9L, 7L, 9L, 9L, 8L, 8L, 9L,
9L, 9L, 8L, 9L, NA, 7L, 7L, 8L, 7L, 8L, 7L, 7L, 8L, 7L, 7L, 7L,
7L, 7L, 7L, 7L, 7L, 8L), Year = c(2005L, 2006L, 2007L, 2008L,
2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2005L, 2007L, 2008L,
2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2005L, 2008L, 2009L,
2010L, 2011L, 2012L, 2013L, 2014L, 2008L, 2009L, 2010L, 2011L,
2012L, 2005L, 2006L, 2007L, 2006L, 2007L, 2005L, 2006L, 2007L,
2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2005L, 2006L,
2007L, 2008L, 2009L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L,
2011L, 2012L, 2013L, 2014L, 2005L, 2006L, 2007L, 2008L, 2009L,
2010L, 2011L, 2012L, 2013L, 2014L, 2005L, 2006L, 2007L, 2008L,
2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2005L, 2006L, 2007L,
2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2005L, 2006L,
2007L, 2008L, 2009L, 2010L, 2011L, 2012L), O = c(5, NA, NA, NA,
5.5, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
4.83333333333333, NA, 4.16666666666667, NA, NA, NA, 3.5, NA,
NA, NA, NA, NA, NA, 3.83333333333333, NA, NA, NA, NA, 5, NA,
NA, NA, 5.16666666666667, NA, NA, NA, 5, NA, 6, NA, NA, NA, NA,
5.5, NA, NA, NA, 5.16666666666667, NA, NA, NA, 5, NA, 4.5, NA,
NA, NA, 4.33333333333333, NA, NA, NA, 4, NA, 3, NA, NA, NA, 3.16666666666667,
NA, NA, NA, 3.16666666666667, NA, 5.5, NA, NA, NA, 5.66666666666667,
NA, NA, NA, 5.33333333333333, NA, 5.5, NA, NA, NA, 5, NA, NA,
NA), C = c(4.66666666666667, NA, NA, NA, 6.83333333333333, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 4.33333333333333,
NA, 4.16666666666667, NA, NA, NA, 4.33333333333333, NA, NA, NA,
NA, NA, NA, 5.83333333333333, NA, NA, NA, NA, 5.66666666666667,
NA, NA, NA, 6.66666666666667, NA, NA, NA, 6.66666666666667, NA,
6.33333333333333, NA, NA, NA, NA, 5.83333333333333, NA, NA, NA,
6, NA, NA, NA, 6, NA, 6.66666666666667, NA, NA, NA, 6.5, NA,
NA, NA, 6.5, NA, 5.5, NA, NA, NA, 5.83333333333333, NA, NA, NA,
5.16666666666667, NA, 5.5, NA, NA, NA, 5.66666666666667, NA,
NA, NA, 5.16666666666667, NA, 5.66666666666667, NA, NA, NA, 6,
NA, NA, NA), E = c(4.33333333333333, NA, NA, NA, 5.16666666666667,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 4.66666666666667,
NA, 4.33333333333333, NA, NA, NA, 3.83333333333333, NA, NA, NA,
NA, NA, NA, 4.33333333333333, NA, NA, NA, NA, 5.5, NA, NA, NA,
5.16666666666667, NA, NA, NA, 5.33333333333333, NA, 6.16666666666667,
NA, NA, NA, NA, 5.83333333333333, NA, NA, NA, 4.83333333333333,
NA, NA, NA, 4.5, NA, 4.33333333333333, NA, NA, NA, 4.66666666666667,
NA, NA, NA, 3.83333333333333, NA, 3.5, NA, NA, NA, 3.5, NA, NA,
NA, 5.16666666666667, NA, 2, NA, NA, NA, 3.16666666666667, NA,
NA, NA, 2.66666666666667, NA, 2.33333333333333, NA, NA, NA, 2.5,
NA, NA, NA), A = c(6.75, NA, NA, NA, 7, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, 5.75, NA, 4.75, NA, NA, NA, 5,
NA, NA, NA, NA, NA, NA, 5.5, NA, NA, NA, NA, 5, NA, NA, NA, 4.75,
NA, NA, NA, 5, NA, 5.25, NA, NA, NA, NA, 5.5, NA, NA, NA, 5,
NA, NA, NA, 5.5, NA, 6.75, NA, NA, NA, 5.75, NA, NA, NA, 6.75,
NA, 5, NA, NA, NA, 3.5, NA, NA, NA, 4.75, NA, 5.75, NA, NA, NA,
5.75, NA, NA, NA, 5.5, NA, 5.75, NA, NA, NA, 5.75, NA, NA, NA
), N = c(3.16666666666667, NA, NA, NA, 3.33333333333333, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 3.66666666666667,
NA, 4.5, NA, NA, NA, 4.16666666666667, NA, NA, NA, NA, NA, NA,
2.66666666666667, NA, NA, NA, NA, 2.66666666666667, NA, NA, NA,
2.33333333333333, NA, NA, NA, 3.16666666666667, NA, 1.83333333333333,
NA, NA, NA, NA, 1.33333333333333, NA, NA, NA, 2.83333333333333,
NA, NA, NA, 1.83333333333333, NA, 3.83333333333333, NA, NA, NA,
3, NA, NA, NA, 3.33333333333333, NA, 1.66666666666667, NA, NA,
NA, 2.5, NA, NA, NA, 2.5, NA, 3.83333333333333, NA, NA, NA, 3.33333333333333,
NA, NA, NA, 4.16666666666667, NA, 3.83333333333333, NA, NA, NA,
4.5, NA, NA, NA)), .Names = c("Person_ID", "Job_Satisfaction",
"Year", "O", "C", "E", "A", "N"), row.names = c(NA, 100L), class = "data.frame")
Upvotes: 0
Views: 115
Reputation: 351
I ended up using a series of loops to do what I needed. Using the trait of "O" as an example:
df$PersonalityYear <- ifelse(df$Year=="2005",
"2005",
ifelse(df$Year=="2009",
"2009",
ifelse(df$Year=="2013",
"2013",
"No")))
#Code to solve the second goal.
df$MostRecentYear <- NA
n <- nrow(df)
for (i in 2:n) df$MostRecentYear[i] <- ifelse(df$PersonalityYear[i]=="2013",
2013,
ifelse(df$PersonalityYear[i]=="2009",
2009,
ifelse(df$PersonalityYear[i]=="2005",
2005,
ifelse(df$Person_ID[i]==df$Person_ID[i-1],
df$MostRecentYear[i-1],
NA))))
df$MostRecentO <- df$O
for (i in 2:n) df$MostRecentO[i] <- ifelse(is.na(df$MostRecentYear[i]),
NA,
ifelse(df$MostRecentYear[i]==df$PersonalityYear[i],
df$O[i],
df$MostRecentO[i-1]))
#Code to solve the first goal.
df$FirstYear <- NA
for (i in 2:n) df$FirstYear[i] <- ifelse(df$Person_ID[i]==df$Person_ID[i-1],
ifelse(is.na(df$MostRecentYear[i-1]),
df$MostRecentYear[i],
df$FirstYear[i-1]),
df$MostRecentYear[i])
df$FirstYearO <- df$O
for (i in 2:n) df$FirstYearO[i] <- ifelse(is.na(df$FirstYear[i]),
NA,
ifelse(df$FirstYear[i]==df$PersonalityYear[i],
df$O[i],
df$FirstYearO[i-1]))
Upvotes: 1
Reputation: 13135
library(dplyr)
library(zoo)
data %>% group_by(Person_ID) %>%
mutate(first_year=dplyr::first(Year[!is.na(O)])) %>% #return first year where O is not missing
mutate(O_fill=na.locf(O, na.rm = FALSE)) %>% #using zoo::na.locf to replace NA's with non-NA prior to it
head(n=20)
# A tibble: 20 x 10
# Groups: Person_ID [3]
Person_ID Job_Satisfaction Year O C E A N first_year O_fill
<int> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <dbl>
1 100003 0 2005 5 4.67 4.33 6.75 3.17 2005 5
2 100003 NA 2006 NA NA NA NA NA 2005 5
3 100003 7 2007 NA NA NA NA NA 2005 5
4 100003 NA 2008 NA NA NA NA NA 2005 5
5 100003 8 2009 5.5 6.83 5.17 7 3.33 2005 5.5
6 100003 10 2010 NA NA NA NA NA 2005 5.5
7 100003 NA 2011 NA NA NA NA NA 2005 5.5
8 100003 NA 2012 NA NA NA NA NA 2005 5.5
9 100003 NA 2013 NA NA NA NA NA 2005 5.5
10 100003 NA 2014 NA NA NA NA NA 2005 5.5
11 100005 9 2005 NA NA NA NA NA NA NA
12 100005 NA 2007 NA NA NA NA NA NA NA
13 100005 NA 2008 NA NA NA NA NA NA NA
14 100005 NA 2009 NA NA NA NA NA NA NA
15 100005 NA 2010 NA NA NA NA NA NA NA
16 100005 NA 2011 NA NA NA NA NA NA NA
17 100005 NA 2012 NA NA NA NA NA NA NA
18 100005 NA 2013 NA NA NA NA NA NA NA
19 100005 NA 2014 NA NA NA NA NA NA NA
20 100006 6 2005 4.83 4.33 4.67 5.75 3.67 2005 4.83
Upvotes: 0