2015-06-15 62 views
2

我正在使用具有數千行的交易數據集。每個記錄都有一個基於符號和日期的唯一鍵。給定符號的交易記錄是不規則的,因此使用動物園將是自然選擇。我需要使用滯後和合並來創建一個新的數據集。但是,我不知道如何在動物園中設置多列索引以便使用滯後函數。以下是一個示例數據集和預期輸出。動物園時間序列中的多部分索引

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 

回答

3

動物園動物園對象是時間序列因此通常這樣做的方式,以使結果是時間序列是使用寬的形式:

read.zoo(df, split = 2) # zoo object created by splitting on column 2 

給予:

  v1.i1 v2.i1 v3.i1 v1.i2 v2.i2 v3.i2 
2015-01-01 110 100 11 212 202 22 
2015-01-02 NA NA NA 213 210 24 
2015-01-05 115 170 13 NA NA NA 
2015-01-06 119 180 16 NA NA NA 

列表或簡單地分割數據幀分成動物園的對象的列表

L <- lapply(split(df[-2], df$id), read.zoo) 

,並提供:

> L 
$i1 
      v1 v2 v3 
2015-01-01 110 100 11 
2015-01-05 115 170 13 
2015-01-06 119 180 16 

$i2 
      v1 v2 v3 
2015-01-01 212 202 22 
2015-01-02 213 210 24 

熔融使用reshape2包我們可以創建長表格:

m <- melt(df, id = 1:2) 

,並提供:

> m 
      dt id variable value 
1 2015-01-01 i1  v1 110 
2 2015-01-05 i1  v1 115 
3 2015-01-06 i1  v1 119 
4 2015-01-01 i2  v1 212 
5 2015-01-02 i2  v1 213 
6 2015-01-01 i1  v2 100 
7 2015-01-05 i1  v2 170 
8 2015-01-06 i1  v2 180 
9 2015-01-01 i2  v2 202 
10 2015-01-02 i2  v2 210 
11 2015-01-01 i1  v3 11 
12 2015-01-05 i1  v3 13 
13 2015-01-06 i1  v3 16 
14 2015-01-01 i2  v3 22 
15 2015-01-02 i2  v3 24 

在這種形式很容易得到各種片。例如,

> subset(m, dt == "2015-01-01") 
      dt id variable value 
1 2015-01-01 i1  v1 110 
4 2015-01-01 i2  v1 212 
6 2015-01-01 i1  v2 100 
9 2015-01-01 i2  v2 202 
11 2015-01-01 i1  v3 11 
14 2015-01-01 i2  v3 22 

3D陣列另一種可能性是將其表示爲一個三維陣列。 m從上面的melt解決方案。我們可以置換第二個參數的部件拿到變化:

a <- acast(m, ... ~ id ~ dt) 

giving: 

, , 2015-01-01 

    i1 i2 
v1 110 212 
v2 100 202 
v3 11 22 

, , 2015-01-02 

    i1 i2 
v1 NA 213 
v2 NA 210 
v3 NA 24 

, , 2015-01-05 

    i1 i2 
v1 115 NA 
v2 170 NA 
v3 13 NA 

, , 2015-01-06 

    i1 i2 
v1 119 NA 
v2 180 NA 
v3 16 NA 

各種片很容易得到:a[1,,]a[,1,]a[,,1]

更新已添加到解決方案並重新安排和改進了一些解決方案。

+0

@Grothendieck,輸出需要連接相同符號的連續行。 read.zoo輸出將i1數據與i2連接到同一日期。這不是預期的輸出。 – kishore

+0

你不能擁有你所要求的東西,並且仍然把它作爲一個可用的動物園對象,但爲了以防萬一,我還增加了一些方法。 –

+0

@Grothendieck,你最後建議的方法看起來更加自然,作爲一個起點,我可以對個人id應用滯後,數據集有數百個符號,最終結果必須返回符號。讓我做一些關於如何完成這項工作的工作。我會發布我的發現。謝謝 – kishore

相關問題