忽略循环的不同迭代中的代码

  • 本文关键字:迭代 代码 循环 r
  • 更新时间 :
  • 英文 :


我有六行代码,它们都对数据集进行了一些预处理。现在我想找出它们的哪种组合效果最好。除此之外,另一个预处理需要一个数字参数(removeSparseTerms(((,因此也必须将其组合在一起。

我想做的是运行一个for循环或类似的东西来评估所有可能的组合:

for(i in seq(0.1, 0.9, by = 0.1)){
tm_map(data, removeWords, stopwords("english"))
tm_map(....)
tm_map(....)
tm_map(....)
tm_map(....)
tm_map(....)
removeSparseTerm(data, i)
<evaluation>
}

我的问题是,我不知道如何让它跳过代码行,即在第一次迭代中,它不应该运行任何tm_map((,在第二次迭代中运行第一个,等等。这还应该包括不同tm_map行的组合。最好的方法是什么?如果语句似乎写得太长了。

如果你有6个函数,并且你想运行它们的所有可能组合,那么就会有2^6=64个可能的组合。这些等价于表示为6位二进制数的数字0-63,其中000000为零,111111为63。因此,要枚举所有可能性,只需为每个函数分配一个标志位(1到6(,然后从0循环到63,并根据其标志位是否存在来有条件地运行每个函数。下面的小助手功能将使这更容易:

check_bit <- function(x, n_bit) !(as.numeric(as.raw(2^(n_bit - 1)) & as.raw(x)) == 0)

让我们看看如何使用以下方法运行一组函数的所有组合的示例:

for(j in 0:63){
if(check_bit(j, 1)) cat("a")
if(check_bit(j, 2)) cat("b")
if(check_bit(j, 3)) cat("c")
if(check_bit(j, 4)) cat("d")
if(check_bit(j, 5)) cat("e")
if(check_bit(j, 6)) cat("f")
cat("n")
}
#> 
#> a
#> b
#> ab
#> c
#> ac
#> bc
#> abc
#> d
#> ad
#> bd
#> abd
#> cd
#> acd
#> bcd
#> abcd
#> e
#> ae
#> be
#> abe
#> ce
#> ace
#> bce
#> abce
#> de
#> ade
#> bde
#> abde
#> cde
#> acde
#> bcde
#> abcde
#> f
#> af
#> bf
#> abf
#> cf
#> acf
#> bcf
#> abcf
#> df
#> adf
#> bdf
#> abdf
#> cdf
#> acdf
#> bcdf
#> abcdf
#> ef
#> aef
#> bef
#> abef
#> cef
#> acef
#> bcef
#> abcef
#> def
#> adef
#> bdef
#> abdef
#> cdef
#> acdef
#> bcdef
#> abcdef

所以你的最后一个循环看起来是这样的:

for(i in seq(0.1, 0.9, by = 0.1)){
for(j in 0:63){
if(check_bit(j, 1)) tm_map(data, removeWords, stopwords("english"))
if(check_bit(j, 2)) tm_map(....)
if(check_bit(j, 3)) tm_map(....)
if(check_bit(j, 4)) tm_map(....)
if(check_bit(j, 5)) tm_map(....)
if(check_bit(j, 6)) tm_map(....)
removeSparseTerm(data, i)
<evaluation>
}
}

最新更新