【问题标题】:Counter in if...else statement in R to fill vector?在 R 中的 if...else 语句中进行计数器填充向量?
【发布时间】:2022-01-05 20:34:32
【问题描述】:

我正在尝试使用依赖于另一个表中的数字的简单计算来填充长度为 4 的向量。最右边的列“nrow”是table 4.1 中行的总和。 Table6.row是表示行名中元素个数的向量:99=0,a,b,d都=1,bd=2,abd=3。我想用table4.1[1, "nrow"]N 的商来填充goalvector[1]goalvector[2] 将填充table4.1[2:4, "nrow"]N 之和的商,因为table4.1 的第2:4 行都表示单个元素(a、b 和d)。以下是我的可重现示例:

table6.row <- c(0,1,1,1,2,3)
table4.1 <- matrix(data=c(0,0,0,1,1,0,0,0,1,0,1,1,1,2,0,0,0,0,0,0,0,0,0,0,1,2,1,1,2,1), nrow=6, ncol=5)
colnames(table4.1) <- c("U1", "U2", "U3", "U4", "nrow") 
rownames(table4.1) <- c("99", "a", "b", "d", "bd", "abd")

下面是我尝试运行的带有 if...else 语句的循环,以最终在末尾创建向量 (goalvector)。

goalvector <- numeric()
n.card <- 0
P <- 1
N <- 8
for (i in ncol(table4.1)) {
  if(table6.row[i]==0) {
      n.card <- table4.1[i, "nrow"]
  } else if(table6.row[i]==table6.row[i-1]) {
      n.card <- n.card + table4.1[i, "nrow"]
  } else {
      goalvector[P] <- n.card/N
      n.card <- 0
      P <- P+1
      n.card <- table4.1[i,"nrow"]
  }
}

我想要的输出:

goalvector <- c(.125, .5, .25, .125)

其中goalvector[1] 等于0.125 或1/8,即table4.1[1,"nrow"]N 的商。 goalvector[2] 等于 0.5 或 4/8,这是 table4.1[2:4, "nrow"]N 之和,因为 table4.1[,"nrow"] 的第 2:4 行都表示行名中包含单个元素的行(a、b 和d)。 goalvector[3] 等于 0.25 或 2/8,即 table4.1[5, "nrow"]N 的商,因为这是唯一代表两个元素 (bd) 的行。

【问题讨论】:

  • table4 在哪里?我们只能看到table4.1
  • 抱歉,刚刚更新了。应该都是table4.1
  • 你能解释一下你是如何从数学上从表格中得到.125的吗?
  • 刚刚更新了这个问题来回答这个问题。很抱歉造成混乱,如果仍然不清楚,我可以重写整个问题。

标签: r loops if-statement matrix counter


【解决方案1】:

据我所知,您想将table4.1[, "nrow"] 中的值与table6.row 中的值相加。然后,将该总和除以N,在本例中为 8。您可以使用基础 R 中的函数 aggregate 来做到这一点。

N <- 8
goalvector <- aggregate(x ~ y, data.frame(x = table4.1[, "nrow"], y = table6.row), sum)$x / N
goalvector

输出

[1] 0.125 0.500 0.250 0.125

【讨论】:

  • 啊!非常感谢,比我尝试做的要简单得多。效果很好。
猜你喜欢
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
相关资源
最近更新 更多