R语言矩阵逐列双条件if-else判断单条件生效的解决方法
问题根源
你原有代码运行不符合预期,是两个R语法特性导致的:
||是单值短路逻辑运算符,只会对传入逻辑向量的第一个元素做判断,不会逐元素遍历所有列做逻辑校验;同时R的if结构本身仅接收单个TRUE/FALSE值,不会自动对向量做逐元素分支判断,根本实现不了逐列判断的逻辑。- 原有逻辑只要触发一次条件成立,就会把整个
rev_sell_buy变量赋值为单个数值0,不会给不同列分别赋值。
注意:逐元素判断的逻辑或需要用单竖线|,不要用双竖线||。
正确实现代码
R原生支持向量化运算,不需要写循环或者多分支if-else,直接按下面的写法即可,运行效率更高、逻辑更清晰:
# 第一步:先计算所有列的第一行减第二行的差值 rev_sell_buy <- sb_bs[1, ] - sb_bs[2, ] # 第二步:把满足「第一行元素为1 或 第二行元素为1」的列对应结果赋值为0 rev_sell_buy[sb_bs[1, ] == 1 | sb_bs[2, ] == 1] <- 0
如果你更习惯用条件函数写法,也可以用逐元素判断的ifelse()函数实现,效果完全一致:
rev_sell_buy <- ifelse( test = sb_bs[1, ] == 1 | sb_bs[2, ] == 1, yes = 0, no = sb_bs[1, ] - sb_bs[2, ] )
运行后得到的rev_sell_buy是长度为95的向量,和矩阵列数一一对应,完全符合逐列判断的需求。
内容的提问来源于stack exchange,提问作者bcsfh
相关产品推荐
相关产品推荐

