【问题标题】:Loop through rows and keep column values less than random value R循环遍历行并保持列值小于随机值 R
【发布时间】:2016-11-06 14:22:51
【问题描述】:

我有一个类似于以下的矩阵,其中包含随机值的累积总和。

dist<-.25
mat<-matrix(data=runif(150,25,55)*dist, nrow = 500,ncol=150)
mat = t(apply(mat, 1, cumsum))

而我想做的是:

为每一行生成一个新的随机值

RV<-runif(1,1,800)

并且对于该行中小于“RV”的所有列,使它们=“na”。我还想为每一行保留(cbind)随机值“RV”

最后我想要一个矩阵(或数据框),其中第一列是为每一行生成的随机值“RV”,并且该行中的所有列的值都小于“RV”,否则为“na”

我知道如何一次识别 1 行的正确值,但我似乎不知道如何使用 apply 函数来做到这一点。也许我必须 for 循环它,但我的真实数据集有接近 100,000 行,所以我想尽可能避免 for 循环

Y<-data.frame(mat)
Y[1, which(Y[1,1:150]< RV)]

我以为这会很容易,但完全被难住了。任何想法将不胜感激

【问题讨论】:

  • 如果不进行编辑,您的示例将无法重现,并且不清楚您希望输出的样子。可以修改一下吗?
  • @ulfelder 抱歉现在应该更好了。希望这能让问题更清楚。

标签: r loops apply


【解决方案1】:

这是一个使用 apply 的解决方案:

mat2 <- apply(mat,
              MARGIN = 1,
              function(x) {
                 zx <- runif(1,1,800)
                 x[x > zx] <- NA
                 return(append(zx, x))
              })

mat2 <- t(mat2)

【讨论】:

  • 谢谢,太好了。只是好奇 Margin =1 部分在做什么?
  • @Jdan margin 告诉apply 如何遍历矩阵。值 1 将执行按行操作,而 2 将执行按列操作。运行mat &lt;- matrix(1:9, nrow = 3); print(mat); apply(mat, MARGIN = 1, FUN = sum); apply(mat, MARGIN = 2, FUN = sum) 看看有什么不同。
猜你喜欢
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
相关资源
最近更新 更多