Перебор имен переменных в R - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь сократить свой код и сделать его немного более эффективным.

Мой пример использования:

Он (приблизительно) будет принимать данные от пользователя, чтобы описать тип данных в основном. Затем требуется подсчет количества каждого типа.

В нынешнем виде это очень неэффективно, но работает. В настоящее время мой код такой:

#############
#1 = 2g4    #
#2 = 5g     #
#3 = dual   #
#############

num_of_Antennas = 4

ant1 = 1
ant2 = 2
ant3 = 2
ant4 = 1


#initialize each count to 0
count2g4 = 0
count5g = 0
countDual = 0

if (num_of_Antennas==4){


  #check type for ant1
  if (ant1==1){
    count2g4 = count2g4+1
  } else if (ant1==2){
    count5g = count5g+1
  } else if (ant1==3){
    countDual = countDual+1;
  } 
  ###############

  #check type for ant2  
  if (ant2==1){
    count2g4 = count2g4 +1
  } else if (ant2==2){
    count5g = count5g +1
  } else if (ant2==3){
    countDual = countDual +1;
  }
  ###############

  #check type for ant3  
  if (ant3==1){
    count2g4 = count2g4 +1
  } else if (ant3==2){
    count5g = count5g +1
  } else if (ant3==3){
    countDual = countDual +1;
  }
  ###############

  #check type for ant4  
  if (ant4==1){
    count2g4 = count2g4 +1
  } else if (ant4==2){
    count5g = count5g +1
  } else if (ant4==3){
    countDual = countDual +1;
  }
  ###############




} else if (num_of_Antennas==3){
  #check type for ant1
  if (ant1==1){
    count2g4 = count2g4+1
  } else if (ant1==2){
    count5g = count5g+1
  } else if (ant1==3){
    countDual = countDual+1;
  } 
  ###############

  #check type for ant2  
  if (ant2==1){
    count2g4 = count2g4 +1
  } else if (ant2==2){
    count5g = count5g +1
  } else if (ant2==3){
    countDual = countDual +1;
  }
  ###############

  #check type for ant3  
  if (ant3==1){
    count2g4 = count2g4 +1
  } else if (ant3==2){
    count5g = count5g +1
  } else if (ant3==3){
    countDual = countDual +1;
  }
  ###############




} else if (num_of_Antennas==2){
  #check type for ant1
  if (ant1==1){
    count2g4 = count2g4+1
  } else if (ant1==2){
    count5g = count5g+1
  } else if (ant1==3){
    countDual = countDual+1;
  } 
  ###############

  #check type for ant2  
  if (ant2==1){
    count2g4 = count2g4 +1
  } else if (ant2==2){
    count5g = count5g +1
  } else if (ant2==3){
    countDual = countDual +1;
  }
  ###############

} else if (num_of_Antennas==1){
  #check type for ant1
  if (ant1==1){
    count2g4 = count2g4+1
  } else if (ant1==2){
    count5g = count5g+1
  } else if (ant1==3){
    countDual = countDual+1;
  } 




} else (print("ERROR, Num of antennas = 0"))

Я немного новичок, когда дело доходит до кодирования, но я уверен, что есть лучший способ сделать это.

Я начал играть с идеей превратить ее в какую-то параметрическую функцию, но пока не нашел хорошего способа сделать это. Итак, как я могу сделать это без ущерба для гибкости? Я также рассчитываю расширить это до максимума 12 антенн, что увеличит количество кода для такой простой задачи.

Заранее спасибо! Cody

EDIT: Как уже указывалось, использование факторов будет чрезвычайно полезным, но это все еще заставляет меня искать какой-то необработанный пользовательский интерфейс, за которым немного легче следовать, чем просто заполнять вектор. Я хотел бы что-то похожее на это:

#(not working)
ant1 = 1
ant2 = 2
ant3 = 3
ant4 = 1


data = paste(ant1, ant2, ant3, ant4 sep = ",")
data


  ant <- c(data)

  ant_f <- factor(ant, levels=c(1:3),labels =c("2G4", "5G", "Dual"))
  table(ant_f)

1 Ответ

0 голосов
/ 06 июля 2018

Спасибо за предоставленный фрагмент вашего кода. Надеюсь, я правильно понял, что вы пытаетесь сделать. Я предлагаю вам держать антенны в векторе. Длина вектора скажет вам, сколько антенн вы пытаетесь посчитать. Вот пример для 12 антенн.

#ant <- c(1,2,2,1)
ant <- c(1,2,2,1,3,2,2,3,1,1,3,2)

ant_f <- factor(ant, levels=c(1:3),labels =c("2g", "5g", "dual"))
table(ant_f)
#> 
#> ant_f
#>   2g   5g dual 
#>    4    5    3 

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

Вы можете обращаться к отдельным антеннам путем поднабора векторов. Поскольку это фактор, он будет носить с собой свою метку.

ant_f[5]
#> [1] dual
#> Levels: 2g 5g dual
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...