【问题标题】:How can repeatedly subtract the rows of a data matrix in R如何在R中重复减去数据矩阵的行
【发布时间】:2015-10-25 21:41:20
【问题描述】:

我有一个 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。新列C的元素是通过计算B列的连续块之和的比率得到的。每个块包含两个元素。换句话说,我想得到以下矩阵:

         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 中执行此操作。有人可以帮助我吗?非常感谢你。 (对不起,我的英语表达不好,我不是母语人士。)

【问题讨论】:

  • 您的问题不是特别明确。我不认为相邻是正确的术语,因为否则 row2 与第 1 行和第 3 行相邻,但这与您正在做的事情不匹配。您还应该指定边缘情况(第一个/最后一个)要做什么。最后……至少在寻求具体帮助之前自己尝试一下。

标签: r matrix


【解决方案1】:

您似乎想对两个元素的连续块求和,如果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))

【讨论】:

  • 谢谢博维尔上校,您的第二种方法很有帮助。
【解决方案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)

【讨论】:

    猜你喜欢
    • 2013-11-08
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2021-08-13
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多