我有以下功能:
colNames = c(1,4)
myfun = function(a,b){
test$result = 0.0
for (i in colNames)
{
test$result = test$result + (test[,i] * exp(-a*test[,i+1]) * exp(b*test[,i+2]))
}
return(test$result)
}
我基本上试图在一个序列中乘以3列(通过对i + 1和i + 2列执行exp操作并将它们与col i相乘)并将其结果添加到对接下来的3列进行的类似操作中。
但是,我有几个空值,每当我在test [,i]中遇到一个空值时,我想从计算中排除它并执行下一个循环。
我的意思是test [,i]中具有空值的行不应该用于计算test $ result。反正有吗?
示例数据:
2 1708.637715 21.30199589 1 408.4464296 19.8614872
1 1708.637715 21.30199589 1 408.4464296 19.8614872
2 1708.637715 21.30199589 1 408.4464296 19.8614872
1 1708.637715 21.30199589 1 408.4464296 19.8614872
6 1708.637715 21.30199589 NA 408.4464296 19.8614872
0 1708.637715 21.30199589 NA 408.4464296 19.8614872
我的第一次迭代应该正常运行,但在下一次迭代中,只有第1列到第4列必须在添加中使用
请帮忙
答案 0 :(得分:1)
在进入循环之前,您只需要使用NA
过滤掉任何行。要做到这一点,代码将是:
test <- test[!apply(is.na(test), 1, any),]
那么如果你将功能改为:
new.myfun = function(a,b){
test <- test[!apply(is.na(test), 1, any),]
test$result = 0.0
for (i in colNames)
{
test$result = test$result + (test[,i] * exp(-a*test[,i+1]) * exp(b*test[,i+2]))
}
return(test$result)
}
new.myfun(1,1)
输出:
[1] 1.736616e-169 1.736616e-169 1.736616e-169 1.736616e-169
希望你想要实现的目标。
您可以显式迭代行(或使用应用函数):
new.myfun = function(a,b){
check.for.na <- function(x,y,z, a, b) {
if(any(is.na(x), is.na(y), is.na(z))){
return(0)
}
return(x*exp(-a*y)*exp(-b*z))
}
result = rep(0, length(test))
for (ROW in 1:length(test)){
for (i in colNames)
{
check_here_for_na <- check.for.na(test[ROW,i], test[ROW,i+1], test[ROW,i+2], a, b)
result[ROW] = result[ROW] + check_here_for_na
}
}
return(result)
}
new.myfun(1,1)