我有一个1000×2矩阵如下:
A B
Row1 0 2
Row2 0 3
Row3 0 4
Row4 0 5
Row5 0 3
Row6 0 4
...
...
Row999 0 8
Row1000 0 9
我想在矩阵中添加一个新列C.通过计算列B的连续块的总和的比率来获得新列C的元素。每个块包含两个元素。换句话说,我想得到以下矩阵:
A B C
Row1 0 2 2/(2+3)
Row2 0 3 3/(2+3)
Row3 0 4 4/(4+5)
Row4 0 5 5/(4+5)
Row5 0 3 3/(3+4)
Row6 0 4 4/(3+4)
...
...
Row999 0 8 8/(8+9)
Row1000 0 9 9/(8+9)
我不知道如何在R中这样做。任何人都可以帮我这个吗?非常感谢你。 (抱歉我的英语表达不佳,我不是母语人士。)
答案 0 :(得分:2)
你似乎想要对两个元素的连续块进行求和,如果m
是你的矩阵,你可以这样做:
library(zoo)
cbind(m, m[,2]/rep(rollapply(m[,2], 2, sum, by=2), each=2))
或基地R
:
x = m[,2][!!seq(nrow(m))%% 2] + m[,2][!seq(nrow(m))%% 2]
cbind(m, rep(x, each=2))
答案 1 :(得分:2)
使用prop.table
通过ave
在每个组内进行计算的另一个基础尝试:
ave(dat$B, cumsum(seq(nrow(dat)) %% 2), FUN=prop.table)
#[1] 0.4000000 0.6000000 0.4444444 0.5555556 0.4285714 0.5714286
#### 2/(2+3) 3/(2+3) 4/(4+5) 5/(4+5) 3/(3+4) 4/(3+4)
甚至只是:
dat$B / ave(dat$B, cumsum(seq(nrow(dat)) %% 2), FUN=sum)