循环中的重复和while问题,以及一些条件。

问题描述 投票:0回答:1

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

我的例子。

#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{},我将覆盖已经满足第一个条件的结果。请问有什么办法吗?

r loops while-loop repeat
1个回答
1
投票

你可以把 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

创建于2020-06-11 重读包 (v0.3.0)

© www.soinside.com 2019 - 2024. All rights reserved.