2015-06-25 1 views
0

В настоящее время я использую R для преобразования данных из эксперимента в высококачественный набор данных. Одной из особенностей моего кода является обнаружение повторений эксперимента и их маркировка. Я написал следующий код для этого: -Вызов меток из таблицы в R

DAYREP<-function(a){ 
    CAPS<-c("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P", 
      "Q","R","S","T","U","V","W","X","Y","Z") 
    if (unique(table(a))==1 && length(unique(table(a)))==1){ 
    return(a) 
    } 
    else{ 
    for (i in a){ 
     if (table(a)[[i]]>=2){ 
     CAPS.sum<-CAPS[1:as.vector(table(a)[[i]])-1] 
     val<-c(i,paste0(i,CAPS.sum)) 
     del<-a[!a %in% i] 
     vec<-append(del,val,after=i-1) 
     return(vec) 
     } 
    } 
    } 
} 

Я использовал следующие векторы чисел дня для тестирования и они подчеркивают каждый возможный результат известен до сих пор.

a<-c(1,2,3,4,5,6,7,8,9) 
b<-c(1,2,3,4,5,6,7,8,8) 
c<-c(1,2,3,3,4,5,6) 
d<-c(1,1,1,1,1,1) 
e<-c(1,2,2,3,4,5,6,6,7) 
f<-c(2,7,8,10,11,11,14) 

Он производит следующий вывод: -

> DAYREP(a) 
[1] 1 2 3 4 5 6 7 8 9 
> DAYREP(b) 
[1] "1" "2" "3" "4" "5" "6" "7" "8" "8A" 
> DAYREP(c) 
[1] "1" "2" "3" "3A" "4" "5" "6" 
> DAYREP(d) 
[1] "1" "1A" "1B" "1C" "1D" "1E" 
> DAYREP(e) 
[1] "1" "2" "2A" "3" "4" "5" "6" "6" "7" 
> DAYREP(f) 
Error in table(a)[[i]] : subscript out of bounds 

Функция работает на всех тестах, но е и е. С e он преобразует только первый набор повторяющихся значений, а с f возвращает сообщение об ошибке.

Я знаю, что проблема вызвана элементом table(a)[[i]], вызывающим значение частоты из таблицы, однако я не уверен в том, существует ли метод для вызова значений, которые табулируются из таблицы. Например.

> table(e) 
e 
1 2 3 4 5 6 7 
1 2 1 1 1 2 1 

Метод, который я использую, вызывает нижнюю строку, однако я хочу назвать верхнюю строку. Кто-нибудь знает об этом?

+0

Вы смотрели функцию 'make.unique'? – cr1msonB1ade

+0

Я раньше не знаком с этим, но я только что просмотрел его и сделал то, что хотел, чтобы код выше. Благодарю. –

+0

Вы можете использовать 'LETTERS', а не вводить их вручную. –

ответ

0

@ cr1msonB1ade любезно предложил использовать функцию make.unique, которая может выполнять то, что делает вышеуказанная функция с небольшими изменениями.

> make.unique(e) 
[1] "1" "2" "2.1" "3" "4" "5" "6" "6.1" "7" 

Спасибо!

0

Как указано в моем комментарии, я думаю, что вы хотите встроенная функция make.unique, но есть также некоторые проблемы с тем, как вы используете таблицу, поэтому я также хотел бы обратиться к этим вопросам. Если вы хотите получить доступ к значениям в table через имя переменной (i в вашем цикле for), вы хотите индексировать с помощью отдельных скобок [, а не в двух скобках [[. Другая проблема заключается в том, что таблица преобразует значения в факторы и, следовательно, вам нужно будет индексировать с помощью as.character(i). Я не думаю, что это полностью исправило ваш скрипт, но он может приблизиться к вам достаточно близко.

Смежные вопросы