R - манипулирование данными временных рядов

У меня есть набор данных временных рядов с ежегодными значениями за 30 лет для> 200 000 учебных единиц, которые все начинаются с одного и того же значения «здоровый == 1» и могут переходить к 3 классам — «подверженный воздействию == 2», «зараженный = =3' и 'восстановить==4'; некоторые единицы также остаются «здоровыми» на протяжении всего временного ряда. Набор данных имеет длинный формат.

Я хотел бы манипулировать набором данных, который хранит все 30 лет для каждой единицы, но рухнул только до «здорового == 1» и «зараженного == 3», т.е. я бы классифицировал «открытый == 2» как «здоровый == 1» и в первый раз, когда «здоровый» блок получает «заражение == 3», он остается зараженным до конца временного ряда, даже если он может «выздороветь == 4» / снова изменить состояние (заразиться и снова выздороветь). Здоровые юниты, которые никогда не переходят в другой класс, останутся классифицированными как здоровые на протяжении всего временного ряда.

Я немного в тупике, как это закодировать в r; Благодарим за любую идею

пример набора данных для двух объектов; один остается здоровым на протяжении всего временного ряда, а другой имеет несколько переходов.

            UID annual_change_val year
1      control1                 1 1990
4      control1                 1 1991
5      control1                 1 1992
7      control1                 1 1993
9      control1                 1 1994
12     control1                 1 1995
13     control1                 1 1996
16     control1                 1 1997
18     control1                 1 1998
20     control1                 1 1999
22     control1                 1 2000
24     control1                 1 2001
26     control1                 1 2002
28     control1                 1 2003
30     control1                 1 2004
31     control1                 1 2005
33     control1                 1 2006
35     control1                 1 2007
38     control1                 1 2008
40     control1                 1 2009
42     control1                 1 2010
44     control1                 1 2011
46     control1                 1 2012
48     control1                 1 2013
50     control1                 1 2014
52     control1                 1 2015
53     control1                 1 2016
55     control1                 1 2017
57     control1                 1 2018
59     control1                 1 2019
61     control1                 1 2020
2  control64167                 1 1990
3  control64167                 1 1991
6  control64167                 1 1992
8  control64167                 2 1993
10 control64167                 2 1994
11 control64167                 2 1995
14 control64167                 2 1996
15 control64167                 2 1997
17 control64167                 3 1998
19 control64167                 3 1999
21 control64167                 4 2000
23 control64167                 4 2001
25 control64167                 4 2002
27 control64167                 4 2003
29 control64167                 3 2004
32 control64167                 4 2005
34 control64167                 4 2006
36 control64167                 4 2007
37 control64167                 4 2008
39 control64167                 4 2009
41 control64167                 4 2010
43 control64167                 4 2011
45 control64167                 4 2012
47 control64167                 4 2013
49 control64167                 4 2014
51 control64167                 4 2015
54 control64167                 4 2016
56 control64167                 4 2017
58 control64167                 4 2018
60 control64167                 4 2019
62 control64167                 4 2020

Чтобы уточнить: вы спрашиваете, как заменить значения в annual_change_val с 2 на 1 и с 4 на 3? Или что-то еще?

Andrea M 19.03.2022 21:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
37
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Обновление на основе комментариев/разъяснений.

Здесь я заменяю значения, как и раньше, а затем создаю временную переменную с именем max_inf, которая содержит максимальный год, когда UID был «заражен» (статус = 3). Затем я заменяю статус на 3 для любого года, выходящего за этот год (в пределах UID).

d %>%
  mutate(status = if_else(annual_change_val %in% c(1,2),1,3)) %>% 
  group_by(UID) %>% 
  mutate(max_inf = max(year[which(status==3)],na.rm=T),
         status = if_else(!is.na(max_inf) & year>max_inf & status==1,3,status)) %>% 
  select(!max_inf)

Вы можете просто изменить значения с 2 на 1 и с 4 на 3, как упомянул Андреа в комментариях. Если d ваши данные, то

library(dplyr)
d %>% mutate(status = if_else(annual_change_val %in% c(1,2),1,3))             
library(data.table)
setDT(d)[, status:=fifelse(annual_change_val %in% c(1,2),1,3)]

Спасибо за ответ Лангтанг; ваш код отлично работает для преобразования значений, но есть условный компонент для изменения значений, как я описал выше Андреа.

Anand Roopsind 20.03.2022 02:23

понял.. см. обновление

langtang 20.03.2022 02:33

Спасибо Лангтанг - вы предоставили отличную логику для решения моей проблемы с кодированием. Я немного подправил, чтобы получить результат, который я искал. d %>% group_by(UID) %>% mutate(dyr =min(год[который(annual_change_val==3)]), dyr2 = ifelse(is.infinite(dyr), NA, defor_yr), year_value_v2 = ifelse(is .na(dyr2), 1, ifelse(год >= dyr2,3,1)))

Anand Roopsind 20.03.2022 15:50

Отлично, рад, что вы получили то, что вам нужно

langtang 20.03.2022 16:00

Если по какой-то причине вы хотите использовать только базу R,

df$annual_change_val[df$annual_change_val == 2] <- 1
df$annual_change_val[df$annual_change_val == 4] <- 3

Первая строка означает: взять столбец annual_change_val из ($) фрейма данных df, подмножить его ([), чтобы у вас остались только значения, равные 2, и повторно присвоить (<-) им значение 1 вместо этого. Аналогично для второй строки.

Спасибо за ответ Андреа. Однако это не так просто, как преобразование значений. Возьмем, к примеру, у меня есть единица, которая «здорова» == 1 в течение 10 лет (1990-2000); получает «заражение == 2» в течение 3 лет (2001–2004 гг.), «заражение == 3» в течение 4 лет (2005–2009 гг.), Затем «выздоравливает == 4» в течение 5 лет (2010–2015 гг.), а затем классифицируется как « здоровый == 1' для остальных лет (2016-2020). Я хочу перекодировать значения, чтобы они имели здоровый == 1 с 1990 по 2004 год, а затем с года до «зараженный == 3» (2005-2020).

Anand Roopsind 20.03.2022 02:16

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