在逐列计算中排除具有NA的行

时间:2015-05-17 08:43:54

标签: r na

我有以下功能:

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列必须在添加中使用

请帮忙

1 个答案:

答案 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)