Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:在多次比较后替换不同列中的元素_R_If Statement - Fatal编程技术网

R:在多次比较后替换不同列中的元素

R:在多次比较后替换不同列中的元素,r,if-statement,R,If Statement,我有一个原始的调查数据df,有5个人的7个项目。每个人的一个项目(不同的项目)是比较的主题。向量vec表示项目的位置。此外,还有两个矩阵prob1prob2用于比较。比较结果是,如果随机值低于prob1中项目所在位置的值,则原始调查响应将替换为9。如果随机值介于prob1和prob2的值之间,则原始调查响应将替换为99 在下面的示例中,对于第一个受访者,第3项的响应(即3)是比较的主题。prob1和prob2的对应值分别为.103和.781。由于第一个响应者的随机数,.482介于两个值之间,因此

我有一个原始的调查数据
df
,有5个人的7个项目。每个人的一个项目(不同的项目)是比较的主题。向量
vec
表示项目的位置。此外,还有两个矩阵
prob1
prob2
用于比较。比较结果是,如果随机值低于
prob1
中项目所在位置的值,则原始调查响应将替换为9。如果随机值介于
prob1
prob2
的值之间,则原始调查响应将替换为99

在下面的示例中,对于第一个受访者,第3项的响应(即
3
)是比较的主题。
prob1
prob2
的对应值分别为
.103
.781
。由于第一个响应者的随机数,
.482
介于两个值之间,因此第一个响应者的初始数据需要替换为99

我当然可以用for-loop来做,但是速度很慢。我试图使用
sapply
函数,但我确实没有得到正确的解决方案。有什么建议吗?谢谢

set.seed(100)
df<-as.data.frame(matrix(sample(c(1:4),35,replace=T),nrow=5))
vec<-c(3,5,2,3,1)
set.seed(1)
prob1<-round(matrix(runif(35,0,.5), nrow=5),3)
set.seed(2)
prob2<-round(matrix(runif(35,.51,1), nrow=5),3)
ran<-c(.482, .298, .115, .163, .644)

> df
   V1 V2 V3 V4 V5 V6 V7
 1  2  2  3  3  3  1  2
 2  2  4  4  1  3  4  4
 3  3  3  2  2  3  4  2
 4  1  3  3  2  3  3  4
 5  3  1  4  3  2  2  3
> prob1
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
[1,] 0.133 0.449 0.103 0.249 0.467 0.193 0.241
[2,] 0.186 0.472 0.088 0.359 0.106 0.007 0.300
[3,] 0.286 0.330 0.344 0.496 0.326 0.191 0.247
[4,] 0.454 0.315 0.192 0.190 0.063 0.435 0.093
[5,] 0.101 0.031 0.385 0.389 0.134 0.170 0.414
> prob2
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
[1,] 0.601 0.972 0.781 0.928 0.834 0.749 0.515
[2,] 0.854 0.573 0.627 0.988 0.700 0.583 0.591
[3,] 0.791 0.918 0.883 0.621 0.920 0.685 0.907
[4,] 0.592 0.739 0.599 0.728 0.584 0.982 0.936
[5,] 0.972 0.779 0.709 0.547 0.680 0.575 0.762
set.seed(100)

df如果我理解正确,您正在尝试访问以下索引

idx <- cbind(seq_along(vec),c(vec))
所以


df[idx[ind99,]]如果随机值大于
prob1
prob2
,那么原始调查响应是否保持不变?是。如果价值大于两者,则无需执行任何操作。非常感谢!因为我不是R方面的专家,我真的不明白
prob2[idx]
如何返回相应的五个概率,
0.781 0.700 0.918 0.599 0.972
你能解释一下吗?看看索引
的帮助文件吗?'['
,一节开始,“第三种形式的索引是通过一个数字矩阵,每个维度有一列。”明白了。我希望能对你们的答案投票一百万次。非常感谢!!
ind99 <- ran < prob2[idx] 
ind09 <- ran < prob1[idx] 
df[idx[ind99,]] <- 99
df[idx[ind09,]] <-  9
V1 V2 V3 V4 V5 V6 V7 1 2 2 99 3 3 1 2 2 2 4 4 1 99 4 4 3 3 9 2 2 3 4 2 4 1 3 9 2 3 3 4 5 99 1 4 3 2 2 3