计算数值向量中1的和的函数给出了错误的结果

时间:2017-08-29 03:54:52

标签: r

我想计算数值向量中1的数量。这是我的代码,它应该是4但它是9,它有问题。

data <- c(1,1,0,0,2,2,1,0,1)
num <- function(x){
n <- length(x)
for (i in 1:n) {
if(x[i]==1) sum1 <- sum(i)
}
return(sum1)
}
num(data)

2 个答案:

答案 0 :(得分:5)

代码中似乎存在一些误解,我不确定如何除了示例之外还有关于修正的课程。针对您所述问题的简短且最佳的R解决方案将是:

sum( data == 1 )

这是有效的,因为当您尝试将逻辑视为数字时,data == 1会为每个TRUE值转换为1,为每个FALSE转换为0。如果您不仅仅想要解决所描述的问题,而是修复了以下类似的代码,那么就可以使用。

num <- function(x){
  n <- length(x)
  sum1 <- 0
  for (i in 1:n) {
    if(x[i]==1) sum1 <- sum1 + 1
  }
  return(sum1)
}

但是,对于长向量,该函数在R中会非常慢。将我在本文开头提出的解决方案转换为函数就可以了。

num <- function(x) sum( x == 1 )

对于R可以在内存中保存的任何向量,此函数将非常快。

答案 1 :(得分:0)

ShapeOpt

结果:

data <- c(1,1,0,0,2,2,1,0,1)
num <- function(x){
  n <- length(x)
  sum1<-0
  for (i in 1:n) {
    if(x[i] == 1){
      sum1<-sum1+1
    } 
  }
return(a)
}  

num(data)

您似乎错误地使用了sum运算符,但您似乎返回的只是最后一次出现[1] 4 的索引。我相信正在发生的事情是你每次都用i和0的总和覆盖1,然后在结尾处返回它,如果你交换了向量中的最后两个元素,你就得到sum1用你的方法。

我的代码我拆分了if语句并明确地包装了它的组件并使用了一个左派赋值运算符,比如increment函数。

我确定有更直接的方法,但在我看来,这种方式更易读,更容易理解。