如何重复减去R中数据矩阵的行

时间:2015-10-25 21:41:20

标签: r matrix

我有一个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中这样做。任何人都可以帮我这个吗?非常感谢你。 (抱歉我的英语表达不佳,我不是母语人士。)

2 个答案:

答案 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)