R重复功能直到满足条件

时间:2013-12-10 23:05:53

标签: r function conditional-statements repeat

我正在尝试生成一个排除某些“错误数据”的随机样本。在我对其进行采样之前,我不知道数据是否“糟糕”。因此,我需要从人群中随机抽取然后进行测试。如果数据“好”,那么保留它。如果数据“不好”,则随机抽取另一个并测试它。我想这样做,直到我的样本大小达到25.下面是我尝试编写一个函数的简化示例。谁能告诉我我错过了什么?

df <- data.frame(NAME=c(rep('Frank',10),rep('Mary',10)), SCORE=rnorm(20))
df

random.sample <- function(x) {
  x <- df[sample(nrow(df), 1), ]
  if (x$SCORE > 0) return(x)
 #if (x$SCORE <= 0) run the function again
}

random.sample(df)

4 个答案:

答案 0 :(得分:18)

以下是while循环的一般用法:

random.sample <- function(x) {
  success <- FALSE
  while (!success) {
    # do something
    i <- sample(nrow(df), 1)
    x <- df[sample(nrow(df), 1), ]
    # check for success
    success <- x$SCORE > 0
  }
  return(x)
}

另一种方法是使用repeatwhile(TRUE)的语法糖)和break

random.sample <- function(x) {
  repeat {
    # do something
    i <- sample(nrow(df), 1)
    x <- df[sample(nrow(df), 1), ]
    # exit if the condition is met
    if (x$SCORE > 0) break
  }
  return(x)
}

break让您退出repeat块。或者,您可以让if (x$SCORE > 0) return(x)直接退出该功能。

答案 1 :(得分:3)

 random.sample <- function(x) {
   x <- df[sample(nrow(df), 1), ]
   if (x$SCORE > 0) return(x)
   Recall(x)# run the function again
 }

 random.sample(df)
#   NAME    SCORE
#14 Mary 1.252566

在我看来,这也应该有效:

 df$SCORE[ df$SCORE > 0 ][ sample(1:sum(df$SCORE > 0), 1) ]
#[1] 0.6579631

答案 2 :(得分:3)

在第一个样本后使用此

while (any(bad <- (x$SCORE <= 0)))
   x[bad, ] <- df[sample(nrow(df), sum(bad)), ]

答案 3 :(得分:2)

您可以直接选择要直接采样的行(仅为5):

> df <- data.frame(NAME=c(rep('Frank',10),rep('Mary',10)), SCORE=rnorm(20))
> df[sample(which(df$SCORE>0), 5),]


 NAME     SCORE
14  Mary 1.0858854
10 Frank 0.7037989
16  Mary 0.7688913
5  Frank 0.2067499
17  Mary 0.4391216

这是无法替换的,因为引导程序放在replace=T中。