我想计算数值向量中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)
答案 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函数。
我确定有更直接的方法,但在我看来,这种方式更易读,更容易理解。