in R, How to sum by flowing row in a data frame

2019-09-21 16:59发布

I have df(A) (ncol=1,nrow=1356)

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

i would like the sum from the first row to the fifth row, and after from the second row to the seventh row, and so on. Furthermore each value is moltiplicate for a fraction of the number of row. The expected results is, for example:

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

In synthesis the sum is every 5 row, roll the data row by row. Thank you in advance.

标签: r dataframe sum
2条回答
劫难
2楼-- · 2019-09-21 17:26

I would use my favorite R function, 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
查看更多
何必那么认真
3楼-- · 2019-09-21 17:44

We could use shift from data.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

Or another option

 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
查看更多
登录 后发表回答