R - Как выборочно скопировать ответы на дела в подробном формате в будущие годы?

Я провожу продольный анализ с данными в длинном формате. У меня есть личность (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")
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
103
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Спасибо за это. К сожалению, это не сбрасывает данные в first_year или O_fill для нового идентификатора.

aspark2020 27.08.2018 00:24

@ aspark2020, как вы можете видеть выше, у меня это работает. Возможно, у вас есть конфликт имен между dplyr и plyr в глаголе group_by, попробуйте загрузить dplyr и zoo в новом сеансе R или вызовите group_by напрямую, используя dplyr::group_by.

A. Suliman 27.08.2018 04:37
Ответ принят как подходящий

В итоге я использовал серию циклов, чтобы делать то, что мне нужно. На примере признака «О»:

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]))

Другие вопросы по теме