R - 处理时间序列数据
R - manipulating time series data
我有一个时间序列数据集,其中包含超过 200,000 个研究单位的 30 年年度值,所有研究单位都以 'healthy==1' 的相同值开始,并且可以过渡到 3 classes - 'exposed==2'、'infected==3' 和 'recover==4';在整个时间序列中,一些单位也保持 'healthy'。数据集为长格式。
我想操纵每个单元保留所有 30 年但折叠为仅 'heathy==1' 和 'infected==3' 的数据集,即我将 class 化 'exposed==2' 作为'healthy==1' 并且 'healthy' 单位第一次获得 'infected==3' 时,它在剩余的时间序列中仍然被感染,即使它可能 'recover==4'/再次改变状态(获得感染并再次康复)。
永远不会过渡到另一个 class 的健康单位将在整个时间序列中保持 class 健康。
我对如何在 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
更新,基于comment/clarification。
在这里,我像以前一样替换值,然后我创建一个名为 max_inf
的临时变量,它保存 UID 被“感染”的最大年份 (status=3)。然后,我将超过该年(在 UID 内)的任何年份的状态替换为 3。
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,正如 Andrea 在评论中提到的那样。如果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)]
如果出于某种原因你只想使用 base R,
df$annual_change_val[df$annual_change_val == 2] <- 1
df$annual_change_val[df$annual_change_val == 4] <- 3
第一行的意思是:从 ($
) 数据帧 df
中取出 annual_change_val
列,对其进行子集化 ([
) 这样你就只剩下值等于 2,而 re-assign (<-
) 改为值 1。第二行也是如此。
我有一个时间序列数据集,其中包含超过 200,000 个研究单位的 30 年年度值,所有研究单位都以 'healthy==1' 的相同值开始,并且可以过渡到 3 classes - 'exposed==2'、'infected==3' 和 'recover==4';在整个时间序列中,一些单位也保持 'healthy'。数据集为长格式。
我想操纵每个单元保留所有 30 年但折叠为仅 'heathy==1' 和 'infected==3' 的数据集,即我将 class 化 'exposed==2' 作为'healthy==1' 并且 'healthy' 单位第一次获得 'infected==3' 时,它在剩余的时间序列中仍然被感染,即使它可能 'recover==4'/再次改变状态(获得感染并再次康复)。 永远不会过渡到另一个 class 的健康单位将在整个时间序列中保持 class 健康。
我对如何在 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
更新,基于comment/clarification。
在这里,我像以前一样替换值,然后我创建一个名为 max_inf
的临时变量,它保存 UID 被“感染”的最大年份 (status=3)。然后,我将超过该年(在 UID 内)的任何年份的状态替换为 3。
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,正如 Andrea 在评论中提到的那样。如果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)]
如果出于某种原因你只想使用 base R,
df$annual_change_val[df$annual_change_val == 2] <- 1
df$annual_change_val[df$annual_change_val == 4] <- 3
第一行的意思是:从 ($
) 数据帧 df
中取出 annual_change_val
列,对其进行子集化 ([
) 这样你就只剩下值等于 2,而 re-assign (<-
) 改为值 1。第二行也是如此。