我正在使用具有數千行的交易數據集。每個記錄都有一個基於符號和日期的唯一鍵。給定符號的交易記錄是不規則的,因此使用動物園將是自然選擇。我需要使用滯後和合並來創建一個新的數據集。但是,我不知道如何在動物園中設置多列索引以便使用滯後函數。以下是一個示例數據集和預期輸出。動物園時間序列中的多部分索引
df = data.frame(
dt = as.Date(c("2015-01-01", "2015-01-05", "2015-01-06",
"2015-01-01", "2015-01-02")),
id = c("i1", "i1", "i1", "i2", "i2"),
v1 = c(110, 115, 119, 212, 213),
v2 = c(100, 170, 180, 202, 210),
v3 = c(11, 13, 16, 22, 24)
)
df$id = as.character(df$id)
和輸出應該是
2015-01-01, i1, 110, 100, 11, 2015-01-05, i1, 115, 170, 13
2015-01-05, i1, 115, 170, 13, 2015-01-06, i1, 119, 180, 16
2015-01-06, i1, 119, 180, 16, NA, NA, NA, NA, NA
2015-01-01, i2, 212, 202, 22, 2015-01-02, i2, 213, 210, 24
2015-01-02, i2, 213, 210, 24, NA, NA, NA, NA, NA
在SO,有崗位實現「分組」滯後操作,但只對單個列數。我正在尋找合併完整的行,無論列數。
更新到這個問題...
以下是解決基於動物園的「分組」滯後操作一種可能的方式。
doProcessing = function(df){
icolnames = colnames(df)
tt = zoo(df, df$dt)
tt1 = merge(tt, lag(tt, 1))
colnames(tt1) = c(icolnames, paste0("lag_", icolnames))
data.frame(tt1, stringsAsFactors=F)
}
fin_df = do.call(rbind, with(df, by(df, list(id), doProcessing, simplify=F)))
該最終輸出幀具有每個場作爲因子。如何根據輸入數據框獲得正確的輸出結構?
根據@格洛騰迪克的lapply的想法,下面給出了上述問題的可能解決方案。
doProcessing = function(df){
icolnames = colnames(df)
tt = zoo(df, df$dt)
tt1 = merge(tt, lag(tt, 1))
colnames(tt1) = c(icolnames, paste0("lag_", icolnames))
data.frame(tt1, stringsAsFactors=F)
}
fin_df = do.call(rbind, with(df, by(df, list(id), doProcessing, simplify=F)))
仍然需要一些幫助,一些結果數據框如何將每列作爲因素。我如何獲得原始結構?
原始數據幀結構
> str(df)
'data.frame': 5 obs. of 5 variables:
$ dt: Date, format: "2015-01-05" "2015-01-01" ...
$ id: chr "i1" "i1" "i1" "i2" ...
$ v1: num 115 110 119 212 213
$ v2: num 170 100 180 202 210
$ v3: num 13 11 16 22 24
所得數據幀看起來像
> str(fin_df)
'data.frame': 5 obs. of 10 variables:
$ dt : Factor w/ 4 levels "2015-01-01","2015-01-05",..: 1 2 3 1 4
$ id : Factor w/ 2 levels "i1","i2": 1 1 1 2 2
$ v1 : Factor w/ 5 levels "110","115","119",..: 1 2 3 4 5
$ v2 : Factor w/ 5 levels "100","170","180",..: 1 2 3 4 5
$ v3 : Factor w/ 5 levels "11","13","16",..: 1 2 3 4 5
$ lag_dt: Factor w/ 3 levels "2015-01-05","2015-01-06",..: 1 2 NA 3 NA
$ lag_id: Factor w/ 2 levels "i1","i2": 1 1 NA 2 NA
$ lag_v1: Factor w/ 3 levels "115","119","213": 1 2 NA 3 NA
$ lag_v2: Factor w/ 3 levels "170","180","210": 1 2 NA 3 NA
$ lag_v3: Factor w/ 3 levels "13","16","24": 1 2 NA 3 NA
@Grothendieck,輸出需要連接相同符號的連續行。 read.zoo輸出將i1數據與i2連接到同一日期。這不是預期的輸出。 – kishore
你不能擁有你所要求的東西,並且仍然把它作爲一個可用的動物園對象,但爲了以防萬一,我還增加了一些方法。 –
@Grothendieck,你最後建議的方法看起來更加自然,作爲一個起點,我可以對個人id應用滯後,數據集有數百個符號,最終結果必須返回符號。讓我做一些關於如何完成這項工作的工作。我會發布我的發現。謝謝 – kishore