Я провожу продольный анализ с данными в длинном формате. У меня есть личность (O, C, E, A, N), измеренная в 2005, 2009 и 2013 годах, а моя зависимая переменная (удовлетворенность работой) измеряется каждый год. У каждого человека есть свой ID. У меня две цели (которых я думаю может быть достигнуто с помощью той же базовой логики):
1) Мне нужна еще одна переменная (столбец), указывающая на первый год измерения личности каждого человека. Если личность никогда не измерялась, верните NA. Например, если личность была впервые измерена в 2009 году, то «2009» необходимо вернуть в этом столбце для каждой строки для этого идентификатора.
2) Мне нужна еще одна переменная (столбец), которая копирует ответы на индивидуальные вопросы за каждый год для каждого идентификатора, если только он не заменен более поздним годом измерения (например, 2009, 2013). Например, если идентификатор прошел личностный тест в 2005 и 2009 годах, то мне нужно, чтобы их ответы за 2005 год были скопированы в 2006, 2007 и 2008 годы, но не в 2009 году, поскольку более поздние записи (если они существуют) должны стать тем, что будет скопировано. вперед в будущие годы.
Я попытался создать для них функцию, но в конечном итоге потерпел неудачу.
Я надеюсь, что в этом есть смысл. Ниже приведены выдержки из 100 случаев:
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")





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
@ aspark2020, как вы можете видеть выше, у меня это работает. Возможно, у вас есть конфликт имен между dplyr и plyr в глаголе group_by, попробуйте загрузить dplyr и zoo в новом сеансе R или вызовите group_by напрямую, используя dplyr::group_by.
В итоге я использовал серию циклов, чтобы делать то, что мне нужно. На примере признака «О»:
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]))
Спасибо за это. К сожалению, это не сбрасывает данные в first_year или O_fill для нового идентификатора.