我正在尝试生成一个排除某些“错误数据”的随机样本。在我对其进行采样之前,我不知道数据是否“糟糕”。因此,我需要从人群中随机抽取然后进行测试。如果数据“好”,那么保留它。如果数据“不好”,则随机抽取另一个并测试它。我想这样做,直到我的样本大小达到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)
答案 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)
}
另一种方法是使用repeat
(while(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
中。