我有一个基本问题,我遗憾地无法弄清楚。我有一组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)
}
答案 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)
希望这有帮助!