R中向量输入的最大函数求和?

时间:2017-08-14 20:13:10

标签: r for-loop if-statement

我想建立这个函数:f(a,b)= sum_ {i = 1到n}(max(a-b_i,0))其中b =(b_1,b_2,... b_n)。这就是我所做的:

    vec<-function(a,b){
                  z<-0
                   for(i in b){
                         ifelse(a > i,z <- z + (a-i), 0)
                       }
                return(data.frame(z))
                   }

此代码为a的标量输入提供正确的输出。但使用矢量输出答案并不总是正确的。例如

    > vec(c(-6,5),c(3,1,3)) 
  gives -25 for a=-6 and 8 for a=5 respectively. 

 But   > vec(-6,c(3,1,3))  gives 0. And this the correct answer.

请抛出一些想法我将如何纠正它。

2 个答案:

答案 0 :(得分:0)

当您a = c(-6,5)时,此参数a > i变为(FALSE, TRUE)。由于它包含true,因此向量将传递到z <- z + (a-i)。请注意,如果您在此公式中使用a=-6,则会获得-25的输出。我建议做这样的事情:

vec<-function(a,b){
z<-0
for(i in b){
p <- ifelse(a > i,z <- z + (a-i), 0)
}
return(data.frame(p))
}

答案 1 :(得分:0)

我相信你错过的只是总结正数的条件,正如条件&#39; max(a-b_i,0)&#39;所表示。

此代码适用于您提供的示例:

vec <- function(a, b){
  n <- NULL
  for(i in 1:length(a)){
    z <- a[i] - b
    z <- z[z > 0]
    n <- c(n, sum(z))
  }

  return(n)
}

例如:

> vec(c(-6, 5), c(3, 1, 3))
[1] 0 8

> vec(-6, c(3, 1, 3))
[1] 0

如果您想获取data.frame,只需将return(n)指令替换为return(data.frame(n))