R语言双层for循环与if条件代码逻辑解析求助
R语言双层循环与条件判断代码逻辑解析
原代码展示
w<-c(2,5,4,3,5,6,8,2,4,6,8) x<-c(2,5,6,7,1,1,4,9,8,8,2) y<-c(2,5,6,3,2,4,5,6,7,3,5) z<-c(2,5,4,5,6,3,2,5,6,4,6) letras<-data.frame(w,x,y,z) l=1 o=1 v=nrow(letras) letras$op1<-c(1) letras$op2<-c(0) for (l in 1:v) { for (o in 1:v) { if(letras$x[o]==letras$y[l] & letras$z[l]==letras$z[o] & letras$w[l]){ letras$op1<-letras$op1+1 letras$op2<-letras$x*letras$y } } }
代码运行逻辑拆解
1. 数据初始化
- 先创建4个长度为11的数值向量
w、x、y、z,合并成名为letras的DataFrame,共11行4列。 - 初始化循环变量
l、o为1,v存储letras的行数(即11)。 - 新增两列
op1和op2:letras$op1 <- c(1):因赋值长度小于行数,R自动循环填充,最终op1初始值为11个1。letras$op2 <- c(0):同理,op2初始值为11个0。
2. 双层循环逻辑
外层循环l遍历1到11(对应letras的每一行),内层循环o同样遍历1到11,相当于对**所有行对组合(l, o)**逐一进行判断。
3. 条件判断逻辑
if语句包含三个用&(逻辑与)连接的条件,需同时满足才执行后续操作:
letras$x[o] == letras$y[l]:第o行的x值等于第l行的y值。letras$z[l] == letras$z[o]:第l行的z值等于第o行的z值。letras$w[l]:R中非零数值会被判定为TRUE,零为FALSE。由于w的所有元素都是非零值,这个条件永远成立,无实际过滤作用。
4. 条件满足时的操作逻辑
当条件满足时,执行两个整列操作:
letras$op1 <- letras$op1 + 1:整个op1列的每个元素都加1,而非仅修改某一行。每满足一次条件,所有行的op1值都会+1。letras$op2 <- letras$x * letras$y:整个op2列被替换为x列与y列对应元素相乘的结果。每次满足条件都会覆盖op2的全部值,最终op2的结果就是x*y的计算值(最后一次覆盖的结果)。
5. 最终结果说明
op1的最终值 = 初始值1 + 满足条件的行对(l, o)总数量,因为每满足一次就给整列加1。op2的最终值就是x和y逐行相乘的结果,因为最后一次满足条件时的赋值会覆盖之前的所有值。
内容的提问来源于stack exchange,提问作者Ramiro Guzmán
相关产品推荐
相关产品推荐

