2012-03-27 47 views
0

我有數據的矩陣,從針對數據幀匹配現有的矩陣填充具有多個列的矩陣

    12345  12348 
2011-05-13   NA 0.18001079 
2011-05-16 0.056780170 0.15526660 
2011-05-17 0.005848973 0.17363081 
2011-05-18 0.096594178 0.20114677 
2011-05-19 0.038920055 0.15744843 

和我有一個數據幀,DF

id date 
12345 2011-05-13 
12345 2011-05-18 
12348 2011-05-13 
12348 2011-05-19 

我想添加到我的數據幀DF一個新條目Ë(我認爲這是另一個矩陣,但我不確定這個術語),它包含了我在df中日期前後20個有用日期的矩陣值。 「有用的一天」我的意思是出現在rownames(m)中的一個。

id date  e 
12345 2011-05-13 [40x1 double matrix] 
12345 2011-05-18 [40x1 double matrix] 
12348 2011-05-13 [40x1 double matrix] 
12348 2011-05-19 [40x1 double matrix] 

我可以使用shift.downshift.up從matrixcalc 20'有用天之前和當前的一天後發現,我可以使用match(df$date,rownames(m)找到索引爲m,我需要。

但是在這裏,我卡住了。創建並填寫新條目的最佳方法是什麼e因此它包含我需要的信息?我知道當-20或+20'有用日落在我所知的範圍之外時,會有NA條目,並且在m之內也有NA條目。

任何幫助非常感謝。

+1

你提供了一些示例數據供我們看看,這很好,但手動重新創建數據集可能會很痛苦。如果您提供代碼來重新創建您正在使用的示例數據,您將得到更快的答案。例如,如果你有'矩陣'm,那麼你可以輸入'dput(m)',你將得到命令重建矩陣,你可以在這裏粘貼。同樣,您可以提供您用來獲得20個「有用日子」的代碼,以便我們快速重現您的情況。 – nograpes 2012-03-27 20:25:22

+0

謝謝,我不知道dput命令 – Ina 2012-03-27 20:48:24

回答

1

我有一種感覺,你正在試圖做的整體可能以不同的方式完成,但這是你所問的解決方案。

# Create the data 
m=matrix(c(NA,0.056780170,0.005848973,0.096594178,0.038920055,0.18001079,0.15526660,0.1736081,0.20114677,0.15744843),ncol=2) 
colnames(m) = c(12345,12348) 
rownames(m) = c('2011-05-13','2011-05-16','2011-05-17','2011-05-18','2011-05-19') 

df=data.frame(id=c(12345,12345,12348,12348),date=as.Date(c('2011-05-13','2011-05-18','2011- 05-13','2011-05-19'))) 

這個想法是首先創建一個函數,它返回單個id和date對的矩陣。我不認爲你需要matrixCalcshift.upshift.down函數,但是如果你覺得更容易,你可以使用它。

# Create a function that returns a matrix for a single row  
get.matrix = function(id,date,shift=20) { 
    row=match(as.character(date),rownames(m)) 
    rows=max(1,row-shift):min(nrow(m),row+shift) 
    m[rows,as.character(id),drop=F] # The drop=F means that it won't be reduced to a vector 
} 

注意函數通常會返回41行,而不是40。此外,如果它是一個「早」或「晚」日期,那麼它可能會返回少得多。

# Apply that function to all rows 
df$e=mapply(get.matrix,id=df$id,date=df$date,SIMPLIFY=F) 

製作函數後,您可以將它應用到數據框中的每一行。