【问题标题】:Conditionally Fill Matrix based on values of another Matrix using For loop使用 For 循环根据另一个矩阵的值有条件地填充矩阵
【发布时间】:2021-04-29 18:31:09
【问题描述】:

我正在尝试使用基于不同矩阵的特定值填充矩阵。

我创建了一个空矩阵:

n <- 64 #length of matrix
vector_walk<- matrix(0, ncol = 1, nrow = n)

然后我从这个分布中填充了那个矩阵

n <- 100000 #How many observations in the distribution
mu <- 180 #Mean vector for distribution
kappa <- 1.5 #How wide the distribution is
mu <- circular(mu, units = c("degrees"), 
               modulo = c("2pi"),
               template = ("geographics"))
Dist <- rvonmises(n, mu, kappa, control.circular=list(units="degrees"))

填充矩阵


for (i in 1:n){
  vector[i] = sample(Dist, 1)
}  

现在这是我卡住的地方。我想用 2 列填充一个新矩阵“grid_walk”,并有条件地用基于“vector_walk”矩阵的值填充它。每当“向量矩阵的值大于 0 且小于 23 以及下面列出的其他一些值时,我想在第一列中添加 0,在第二列中添加 1。我正在尝试使用 if 语句进行此 for 循环

    
for (j in 1:2){
  for(i in 1:n){
    if(vector_walk[i] > 0 & vector_walk[i] < 23) grid_walk[i,j] <- c(0,1)
    if(vector_walk[i] > 23  & vector_walk[i] < 68) grid_walk[i,j] <- c(1,1)
    if(vector_walk[i] > 68 & vector_walk[i] < 113) grid_walk[i,j] <- c(1,0)
    if(vector_walk[i] > 113 & vector_walk[i] < 158) grid_walk[i,j] <- c(1,-1)
    if(vector_walk[i] > 158 & vector_walk[i] < 203) grid_walk[i,j] <- c(0,-1)
    if(vector_walk[i] > 203 & vector_walk[i] < 248) grid_walk[i,j] <- c(-1,-1)
    if(vector_walk[i] > 248 & vector_walk[i] < 293) grid_walk[i,j] <- c(-1,0)
    if(vector_walk[i] > 293 & vector_walk[i] < 338) grid_walk[i,j] <- c(-1,1)
    if(vector_walk[i] > 338 & vector_walk[i] < 361) grid_walk[i,j] <- c(0,1)
  }
}

任何帮助将不胜感激,因为我从未在 R 中使用过 if 或 for 语句

【问题讨论】:

  • 你在这里使用什么包?我假设 rvonmises 为 Rfast,但我不认识您使用的 circular 函数。
  • 我正在使用“循环”和“循环状态”包

标签: r loops for-loop matrix


【解决方案1】:

我会一次实现这一列,因为 for 循环在 R 中(通常)很慢。我们首先创建一个零矩阵,并在它们符合条件时替换值。

library(Rfast)
library(circular)

n <- 100000 #How many observations in the distribution
mu <- 180 #Mean vector for distribution
kappa <- 1.5 #How wide the distribution is
mu <- circular(mu, units = c("degrees"), 
               modulo = c("2pi"),
               template = ("geographics"))
Dist <- rvonmises(n, mu, kappa, control.circular=list(units="degrees"))

# Equivalent to your current "Filling the matrix" step but avoids the loop
vector_walk <- sample(Dist)

# Start by filling everything with zeros
grid_walk <- matrix(numeric(1), nrow = length(vector_walk), ncol = 2)

# If vector_walk is between 23 and 158, replace the first column's default zero with a 1
grid_walk[vector_walk>23&vector_walk<158, 1] <- 1
# If vector_walk is between 203 and 338, replace the first column's default zero with a -1
grid_walk[vector_walk>203&vector_walk<338, 1] <- -1

# Repeat for the second column
grid_walk[(vector_walk>0&vector_walk<68)|(vector_walk>293&vector_walk<361), 2] <- 1
grid_walk[vector_walk>113&vector_walk<248, 2] <- -1

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多