У меня есть набор данных временных рядов с ежегодными значениями за 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
Здесь я заменяю значения, как и раньше, а затем создаю временную переменную с именем 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)]
Спасибо за ответ Лангтанг; ваш код отлично работает для преобразования значений, но есть условный компонент для изменения значений, как я описал выше Андреа.
понял.. см. обновление
Спасибо Лангтанг - вы предоставили отличную логику для решения моей проблемы с кодированием. Я немного подправил, чтобы получить результат, который я искал. 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)))
Отлично, рад, что вы получили то, что вам нужно
Если по какой-то причине вы хотите использовать только базу 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).
Чтобы уточнить: вы спрашиваете, как заменить значения в
annual_change_val
с 2 на 1 и с 4 на 3? Или что-то еще?