Игнорировать код в разных итерациях цикла - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть шесть строк кода, которые все выполняют некоторую предварительную обработку набора данных. Теперь я хочу выяснить, какая комбинация из них работает лучше всего. Кроме того, другая предварительная обработка принимает числовой параметр (removeSparseTerms ()), поэтому его тоже нужно объединить.

Что я хочу сделать, это запустить для l oop или что-то подобное, чтобы оценить все возможные комбинации:

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 (), на второй - во-первых, et c. Это также должно включать комбинации разных строк tm_map. Какой лучший способ сделать это? If-операторы кажутся слишком длинными для записи.

1 Ответ

1 голос
/ 13 апреля 2020

Если у вас есть 6 функций и вы хотите запустить все возможные их комбинации, то будет 2 ^ 6 = 64 возможных комбинаций. Они эквивалентны числам 0-63, представленным в виде 6-битных двоичных чисел, где 000000 равно нулю, а 111111 равно 63. Поэтому все, что вам нужно сделать, чтобы перечислить все возможности, - это присвоить каждой функции бит флага (от 1 до 6), затем l oop от 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

Итак, ваш финальный l oop будет выглядеть примерно так:

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>
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...