我正在计算AUC。我的数据框架包括27个不同的列和49行,我认为AUC代码将计算每列的AUC。它工作,但我的一些列包括NA值。我希望代码忽略NA,并使用该列的其他值计算AUC。我的代码是:
# df is the main data and m is transposed form of df
totalAUC <- NULL
for(a in 1:nrow(df)){
y <- m[2:50,a]
x <- c(seq(from=0, to=240, by=5))
AUC <- data.frame(x,y)
net_auc.fn <- function(x,y) {
auc <- ifelse(y[2] > y[1], (y[2]-y[1])*(x[2]-x[1])/2, 0)
for (i in 3:length(x)) {
if (y[i] >= y[1] & y[i-1] >= y[1] & !is.na(y[i])) {
auc[i-1] <- ((y[i]+y[i-1])/2)*5-(y[1]*5)
} else if (y[i] >= y[1] & y[i-1] < y[1] & !is.na(y[i])) {
auc[i-1] <- ((y[i]+y[i-1])/2)*5-(y[1]*5)
} else if (y[i] < y[1] & y[i-1] >= y[1] & !is.na(y[i])) {
auc[i-1] <- ((y[i]+y[i-1])/2)*5-(y[1]*5)
} else if (y[i] < y[1] & y[i-1] < y[1] & !is.na(y[i])) {
auc[i-1] <- ((y[i]+y[i-1])/2)*5-(y[1]*5)
} else {
return(cat("i:", i, "Error: No condition met\n"))
}
}
return(list(auc=sum(auc, na.rm=TRUE)))
}
netiAUC <- net_auc.fn(AUC$x, AUC$y)
totalAUC <- rbind(totalAUC, data.frame(Number=a,aucL=netiAUC))
}
但我收到错误,因为列与NA
i: 49 Error: No condition met
我的数据在下面,但我不能写整个行和列(它很长),只是有问题的一个。因为它适用于所有其他列(我用这段代码计算了每列的AUC),只有在第23列不起作用(240.min是第49行)。所以我添加了这部分数据:
220 10.1 6.2 11.3 13.4 3.1 8.8 5.7 3.9 6.6 10.3 11.4 7.4 8.9 5.9 8.3 6.9 3.8 6.7 10.2 5.3
225 9.8 6.2 10.7 13.2 3.5 8.9 6.7 3.4 6.6 10.2 11.2 7.4 9.0 5.9 8.2 6.6 3.7 6.6 10.1 5.6
230 9.4 6.0 10.2 13.1 4.8 9.1 7.2 3.1 6.5 9.5 10.8 7.4 9.1 5.9 8.3 6.3 3.6 6.6 9.9 5.8
235 9.1 5.9 9.7 12.8 6.8 9.2 8.1 3.0 6.4 8.5 10.5 7.2 9.0 5.8 8.3 6.0 3.5 6.6 9.5 6.2
240 8.8 5.8 9.1 12.1 8.1 9.6 8.8 3.1 6.4 7.6 10.2 7.1 8.5 5.8 8.3 NA 3.3 6.7 8.7 6.3
如果有人帮助我,我将非常感激
1条答案
按热度按时间yquaqz181#
当
y[i]
是NA
时,if-else序列将失败并返回错误消息。原因是所有if
条件的计算结果都是(NA & <something> & FALSE)
,其结果总是FALSE
。在这种情况下,您必须根据自己的算法来确定想要的行为,而不是返回错误消息。顺便说一句,尝试使用向量化来简化代码,并摆脱for循环。
另外,如果你想要更好的帮助,请发布一个自包含的例子,可以按原样运行,也包括所需的输出。