R:For循环的简单函数

时间:2017-07-23 15:18:03

标签: r for-loop

我有一个基本问题,我遗憾地无法弄清楚。我有一组1和0的数字向量,存储在下面的return变量中,其总和存储在totals变量中。我想检查每个单独的向量,看看结果中是否有连续的零,然后返回它发生的总次数。但是,我对于循环/函数非常生疏和/或不好,并且无法获得此结果。我的最新尝试如下。欢迎任何建议 - 感谢您的帮助。

set.seed(1)
return = ifelse(runif(10) <= 0.6, 1, 0)
totals = sapply(1:10, function (x) sum(ifelse(runif(10)<=0.6,1,0)))

sums = function (x) { 
  g = 0
  for (i in 1:length(x)-1) {
    sum(ifelse (x[i]+x[i+1]=0,1,0)) 
  }
  return (g)
}

2 个答案:

答案 0 :(得分:1)

如果我们要查找连续0次出现的次数(即大于1)及其长度,请使用rle

with(rle(return), lengths[values==0 & lengths > 1])
#[1] 4

return向量是

return
#[1] 1 1 1 0 1 0 0 0 0 1

现在,我们可以看到4连续0的数字。只是为了表明答案与初始vector

相符

for循环(错误的答案只是为了回答)

sums <- function (x) { 
  g  <- 0
   for (i in tail(seq_along(x), -1)) {
    if(x[i-1]==0 & x[i]==0) {
    g <- g+1
  }
 }
  g
}

sums(return)

答案 1 :(得分:1)

虽然这不是最有效的方法(请参阅akrun的回答),但我们可以让你的for循环工作:

sums=function (x)
{ 
  g=0
  # watch your brackets! 1:3-1 returns c(0,1,2), not c(1,2)!
  for (i in 1:length(x)-1)  
  {
    # To test for equality, use a double ==, rather than a single.
    # also, your 'g' variable is not updated, which is what you want to do.
    sum(ifelse (x[i]+x[i+1]=0,1,0)) 
  }
  return (g) 
}

修正:

sums <-function(x)
{ 
  g=0
  for (i in 1:(length(x)-1)) 
    {
    g= g+ifelse(x[i]+x[i+1]==0,1,0)
    }
  return (g) 
}

您可以通过以下方式致电您的职能部门:

return=ifelse(runif(10)<=0.6,1,0)
sums(return)

或者生成10个随机1和0的向量,并将函数应用于它们,你可以这样做:

totals = lapply(1:10, function (x) ifelse(runif(10) <= 0.6, 1, 0))
sapply(totals,sums)

希望这有帮助!