[英]R - preprocessing of time series data
我有以下數據結構,帶有 Stocks S ,具有特征f :
year S1_f1 S1_f2 S2_f1 S2_f2 S3_f1 S3_f2 Sn_f1 Sn_f2
2011 0.1 0.4 0.12 0.42 0.2 0.5 n n
2012 0.4 0.7 0.42 0.72 0.5 0.8 n n
2013 0.7 0.9 0.72 0.5 0.8 0.9 n n
n n n n n n n n n
我原來的 df 有 10 個觀察值,但有 50k+ 個預測變量 - 所以我想在觀察方面產生更多的平衡。
因此,我想要以下 dataframe:
year S1_f1 S1_f2 S2_f1 S2_f2 S3_f1 S3_f2 Sn_f1 Sn_f2
2011 0.1 0.4 0 0 0 0 0 0
2012 0.4 0.7 0 0 0 0 0 0
2013 0.7 0.9 0 0 0 0 0 0
2011 0 0 0.12 0.42 0 0 0 0
2012 0 0 0.42 0.72 0 0 0 0
2013 0 0 0.72 0.5 0 0 0 0
2011 0 0 0 0 0.2 0.5 0 0
2012 0 0 0 0 0.5 0.8 0 0
2013 0 0 0 0 0.8 0.9 0 0
n 0 0 0 0 0 0 n n
...等等(示例值)。
我想通過這種方法人為地增加我的時間戳。
有沒有一種優雅的方式來做到這一點?
您可以使用以下代碼將您擁有的內容轉換為您想要的內容:
library(data.table)
dcast(
melt(setDT(s), id="year")[, grp:=gsub("_.*$","",variable)],
year+grp~variable,
value.var="value"
)[order(grp,year)]
Output:
year grp S1_f1 S1_f2 S2_f1 S2_f2 S3_f1 S3_f2
<int> <char> <num> <num> <num> <num> <num> <num>
1: 2011 S1 0.1 0.4 NA NA NA NA
2: 2012 S1 0.4 0.7 NA NA NA NA
3: 2013 S1 0.7 0.9 NA NA NA NA
4: 2011 S2 NA NA 0.12 0.42 NA NA
5: 2012 S2 NA NA 0.42 0.72 NA NA
6: 2013 S2 NA NA 0.72 0.50 NA NA
7: 2011 S3 NA NA NA NA 0.2 0.5
8: 2012 S3 NA NA NA NA 0.5 0.8
9: 2013 S3 NA NA NA NA 0.8 0.9
輸入:
structure(list(year = 2011:2013, S1_f1 = c(0.1, 0.4, 0.7), S1_f2 = c(0.4,
0.7, 0.9), S2_f1 = c(0.12, 0.42, 0.72), S2_f2 = c(0.42, 0.72,
0.5), S3_f1 = c(0.2, 0.5, 0.8), S3_f2 = c(0.5, 0.8, 0.9)), row.names = c(NA,
-3L), class = "data.frame")
解決您的問題的一種可能方法(請注意,我沒有將數據(例如df
)轉換為data.table
):
library(data.table)
result = sub("^S(\\d)+_.*", "\\1", names(df)[-1]) |>
unique() |>
lapply(function(i) df[sprintf(c("year", "S%s_f1", "S%s_f2"), i)]) |>
rbindlist(use.names=TRUE, fill=TRUE) |>
setnafill(fill=0)
year S1_f1 S1_f2 S2_f1 S2_f2 S3_f1 S3_f2
<int> <num> <num> <num> <num> <num> <num>
1: 2011 0.1 0.4 0.00 0.00 0.0 0.0
2: 2012 0.4 0.7 0.00 0.00 0.0 0.0
3: 2013 0.7 0.9 0.00 0.00 0.0 0.0
4: 2011 0.0 0.0 0.12 0.42 0.0 0.0
5: 2012 0.0 0.0 0.42 0.72 0.0 0.0
6: 2013 0.0 0.0 0.72 0.50 0.0 0.0
7: 2011 0.0 0.0 0.00 0.00 0.2 0.5
8: 2012 0.0 0.0 0.00 0.00 0.5 0.8
9: 2013 0.0 0.0 0.00 0.00 0.8 0.9
使用最后在注釋中可重復定義的樣本數據框DF
,創建一個向量g
定義列的分組,在示例的情況下等於c("S1", "S1", "S2", "S2", "S3", "S3")
。 然后使用它將列拆分為矩陣L
的列表,每個級別的g
都有一個矩陣。 將矩陣.bdiag
中的 .bdiag 應用於該列表以創建塊對角矩陣並插入年份列並設置列名。 請注意,矩陣 package 隨附 R 並且不必安裝,因此僅使用基礎 R。
library(Matrix)
g <- sub("_.*", "", names(DF)[-1])
L <- tapply(as.list(DF[-1]), g, function(x) as.matrix(as.data.frame(x)))
setNames(data.frame(DF$year, as.matrix(bdiag(L))), names(DF))
給予:
year S1_f1 S1_f2 S2_f1 S2_f2 S3_f1 S3_f2
1 2011 0.1 0.4 0.00 0.00 0.0 0.0
2 2012 0.4 0.7 0.00 0.00 0.0 0.0
3 2013 0.7 0.9 0.00 0.00 0.0 0.0
4 2011 0.0 0.0 0.12 0.42 0.0 0.0
5 2012 0.0 0.0 0.42 0.72 0.0 0.0
6 2013 0.0 0.0 0.72 0.50 0.0 0.0
7 2011 0.0 0.0 0.00 0.00 0.2 0.5
8 2012 0.0 0.0 0.00 0.00 0.5 0.8
9 2013 0.0 0.0 0.00 0.00 0.8 0.9
Lines <- "
year S1_f1 S1_f2 S2_f1 S2_f2 S3_f1 S3_f2
2011 0.1 0.4 0.12 0.42 0.2 0.5
2012 0.4 0.7 0.42 0.72 0.5 0.8
2013 0.7 0.9 0.72 0.5 0.8 0.9"
DF <- read.table(text = Lines, header = TRUE)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.