两个矩阵
df_A = matrix(, nrow = 5, ncol = 3)
df_A[,1] = c(0, 0, 1, -1, 1)
df_A[,2] = c(0, 1, -1, 0, -1)
df_A[,3] = c(1, 0, -1, 1, 1)
df_B = matrix(, nrow = 5, ncol = 3)
df_B[,1] = c(1, -1, 0, 0, 1)
我想根据几个条件模拟df_B的第2列和第3列。如果df_A的值为零,则df_B的值不会更改。例如,df_B的前两个值不应在第一次迭代时更改,因为df_A的前两个值为零。如果df_A的值是1或负1,那么df_B的相应值将在给定一定概率的情况下取该值(在该示例中为20%)。例如,如果df_A为负1且df_B为零(或1),则df_B的相应值将在20%的时间内变为负值。
我知道以下内容不正确,但这是我到目前为止所做的:
belief_change = function(x){
if (df_A[x] = -1 & df_B[x] != -1 & sample(1:2, 1, prob = c(0.2, 0.8) = 1))
df_B[x+1] = df_A[x]
else
df_B[x+1] = df_B[x]
if (df_A[x] = 1 & df_B[x] != 1 & sample(1:2, 1, prob = c(0.2, 0.8) = 1))
df_B[x+1] = df_A[x]
else
df_B[x+1] = df_B[x]
if (df_A[x] = 0)
df_B[x+1] = df_B[x]
}
我在这里使用示例函数来帮助生成概率。我还需要最终将它放入for循环中。
答案 0 :(得分:0)
您的代码中存在多个错误。首先,正确的逻辑相等运算符是==
而不是=
。其次,您将= 1
置于sample
的调用中。第三,如果你真的想影响调用函数的外部环境(即通过调用函数来改变df_B
,你需要使用深度赋值运算符<<-
,而不是=
或<-
。您可以阅读有关此here的更多信息。
以下是适用的代码版本;看看它是否符合你的要求。
belief_change <- function(x) {
if (df_A[x] == -1 & df_B[x] != -1 & sample(1:2, 1, prob = c(0.2, 0.8)) == 1)
df_B[x+1] <<- df_A[x]
else
df_B[x+1] <<- df_B[x]
if (df_A[x] == 1 & df_B[x] != 1 & sample(1:2, 1, prob = c(0.2, 0.8)) == 1)
df_B[x+1] <<- df_A[x]
else
df_B[x+1] <<- df_B[x]
if (df_A[x] == 0)
df_B[x+1] <<- df_B[x]
}