簡體   English   中英

R - 操作時間序列數據

[英]R - manipulating time series data

我有一個時間序列數據集,其中包含超過 200,000 個研究單位的 30 年年度值,所有這些研究單位都以“健康==1”的相同值開始,並且可以過渡到 3 個類別 - 'exposed==2','infected= =3' 和 '恢復==4'; 一些單位在整個時間序列中也保持“健康”。 數據集為長格式。

我想操縱每個單元保留所有 30 年的數據集,但崩潰為僅“heathy==1”和“infected==3”,即我會將“exposed==2”分類為“healthy==1”和第一次“健康”單元被“感染==3”,它在剩余的時間序列中仍然被感染,即使它可能再次“恢復==4”/改變 state(被感染並再次恢復)。 永遠不會過渡到另一個 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

如果出於某種原因你只想使用 base R,

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

第一行的意思是:從 ( $ ) dataframe df中取出annual_change_val列,對其進行子集化 ( [ ),這樣您只剩下等於 2 的值,然后將 ( <- ) 重新分配給那些值為 1 的值。 第二行也是如此。

更新,基於評論/澄清。

在這里,我像以前一樣替換值,然后我創建一個名為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)

正如 Andrea 在評論中提到的,您可以簡單地將值從 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)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM