在某些条件下循环重复和 while 问题

Repeat and while problems in loop with some condition

在我的人为问题中,我需要删除在采样过程中创建的空值并进行新的采样过程,直到我只有一个值 (nrow(s.df)>0)。但是,如果满足第一个条件,我会保留结果 (res[[i]] <- s.df),但如果不满足,我需要再次制作一个新样本,为此,我尝试使用 repeatwhileelse 结合的函数没有成功。

我的例子:

#Artificial data set
v0<-rnorm(20)
vNA<-rep(NA, 80)
v<-c(v0,vNA)
id<-1:100
df<-data.frame(id,v)
s_size<-c(1,2,3,4,5)

# Sampling using repeat
res<-list()
for(i in 1:length(s_size)){ # Loop for different sample size
s.df<-df[sample(nrow(df), 3), ] #sampling in data set
s.df<-s.df[complete.cases(s.df), ] #remove NAs
s.df
if (nrow(s.df)>0){
res[[i]] <- s.df# add it to the list
}
}
else{
repeat{
s.df<-df[sample(nrow(df), 3), ] #sampling in data set
s.df<-s.df[complete.cases(s.df), ] #remove NAs 
if (nrow(s.df)>0){
res[[i]] <- s.df# add it to the list
}
if (nrow(res.circle)>0){break}  
}
}
}
big_sample = do.call(rbind, res)


or

# Sampling using while
res<-list()
for(i in 1:length(s_size)){ # Loop 
s.df<-df[sample(nrow(df), 3), ] #sampling in data set
s.df<-s.df[complete.cases(s.df), ] #remove NAs
if (nrow(s.df)>0){
res[[i]] <- s.df# add it to the list
}
}
else{
while(nrow(res.circle)>0) {
s.df<-df[sample(nrow(df), 3), ] #sampling in data set
s.df<-s.df[complete.cases(s.df), ] #remove NAs 
if (nrow(s.df)>0){
res[[i]] <- s.df# add it to the list
}
}
}
big_sample = do.call(rbind, res)

这种方法显然行不通,但是如果我不使用else{},我会覆盖已经满足第一个条件的结果。有什么想法吗?

您可以将 while 循环放在 for 循环中并使其取决于 if 条件的结果,那么您就不需要 else:

set.seed(42)

v0 <- rnorm(20)
vNA <- rep(NA, 80)
v <- c(v0, vNA)
id <- 1:100
df <- data.frame(id, v)
s_size <- c(1, 2, 3, 4, 5)

res <- list()

for (i in 1:length(s_size)) {
  condition <- FALSE
  while (condition == FALSE) {
  s.df <- df[sample(nrow(df), 3),]
  s.df <- s.df[complete.cases(s.df),]
  if (nrow(s.df) > 0) {
    res[[i]] <- s.df
    condition <- TRUE
    }
  }
}

big_sample <-  do.call(rbind, res)

big_sample
#>    id           v
#> 15 15 -0.13332134
#> 8   8 -0.09465904
#> 18 18 -2.65645542
#> 4   4  0.63286260
#> 6   6 -0.10612452
#> 2   2 -0.56469817

reprex package (v0.3.0)

于 2020-06-11 创建