R语言非连续id下嵌套循环与if语句报错求助
报错原因
你在循环中错误地将id列的数值当作数据框的行索引使用,但R里数据框/向量的索引是基于行的位置序号(从1到数据框总行数,这里是6),而非id列的数值。当id取11、15、21这类大于6的值时,data$death[i]会因超出索引范围返回NA,而if语句无法处理NA的逻辑判断,因此抛出missing value where TRUE/FALSE needed错误。
解决方法
方法1:修正循环的索引逻辑
先获取两组干预对应的行位置,而非id值,再用行位置作为循环变量:
# 提取两组干预对应的行号 group1_rows <- which(data$intervention == 1) group2_rows <- which(data$intervention == 2) test <- c() for (i in group1_rows) { for(j in group2_rows){ if (data$death[i] < data$death[j]){ test <- c(test, -1) } else if (data$death[i] > data$death[j]){ test <- c(test, 1) } else { test <- c(test, 0) } } }
方法2:用向量化操作替代嵌套循环(更高效)
R中嵌套循环效率较低,推荐用outer函数实现两组数据的批量比较:
# 提取两组的death值 group1_death <- data$death[data$intervention == 1] group2_death <- data$death[data$intervention == 2] # 批量生成比较结果并转为向量 test <- as.vector(outer(group1_death, group2_death, function(x, y) { ifelse(x < y, -1, ifelse(x > y, 1, 0)) }))
内容的提问来源于stack exchange,提问作者Mel36
相关产品推荐
相关产品推荐

