2016-01-18 40 views
-2

我有DF(A)(NcoI位= 1,nrow = 1356)在R,如何通過在數據幀中流動行總和

col1 
5 
7 
9 
3 
2 
3.8 
24 
2.7 
12 
11 
23 
.... to 1356 row... 

我想從第一行的總和至第五行,從第二行到第七行之後,依此類推。此外,每個數值對於行數的一小部分是複製的。預期的結果是,例如:

5*1/5 + 7*2/5 + 9*3/5 + 3*4/5 + 2*5/5= (result) 
7*1/5 + 9*2/5 + 3*3/5 + 2*4/5 + 3.8*5/5= (result) 
9*1/5 + 3*2/5 + 2*3/5 + 3.8*4/5 + 24*5/5= (result) 
and so on for the 1356 row 

綜合中每5行一列,逐行滾動數據。 預先感謝您。

+0

任何你已經試過嗎? – Heroka

+0

也許'library(data.table); m1 < - na.omit(do.call(cbind,shift(df1 $ col1,0:4,type =「lead」))); rowSums(m1 *(1:5)[col(m1)]/5)' – akrun

+0

對於目前只有apply函數,但結果是不同的尊重我想要的。 – Diego

回答

0

我們可以使用shiftdata.table

library(data.table) 
m1 <- na.omit(do.call(cbind, shift(df1$col1, 0:4, type="lead"))) 
rowSums(m1*(1:5)[col(m1)]/5) 
#[1] 13.60 12.20 31.24 25.58 30.48 32.58 44.88 

或者另一種選擇

m1 <- embed(df1$col1,5) 
rowSums(m1*(5:1)[col(m1)]/5) 
#[1] 13.60 12.20 31.24 25.58 30.48 32.58 44.88 
2

我會用我最喜歡的一個R函數,filter

DF <- read.table(text = "col1 
       5 
       7 
       9 
       3 
       2 
       3.8 
       24 
       2.7 
       12 
       11 
       23", header = TRUE) 

5*1/5 + 7*2/5 + 9*3/5 + 3*4/5 + 2*5/5 
#[1] 13.6 
7*1/5 + 9*2/5 + 3*3/5 + 2*4/5 + 3.8*5/5 
#[1] 12.2 
9*1/5 + 3*2/5 + 2*3/5 + 3.8*4/5 + 24*5/5 
#[1] 31.24 

c(na.omit(stats::filter(DF$col1, (5:1)/5))) 
#[1] 13.60 12.20 31.24 25.58 30.48 32.58 44.88