2016-06-03 12 views
0

У меня проблема с заменой в r, у меня есть переменная со многими значениями, которые я хочу заменить в подстроке «fin», я хочу заменить значения на менее 26 Часто Задаваемые, вот мой код:Заменить различные подстроки data.frame с переменной в R

n.tab <- table(as.character(joined1$codigo)) 
    n.many <- names(n.tab[ n.tab < 26]) 
    length(n.many)#2311 NOTE: fin is made with paste of values, codigo is one of them 
    joinedAux<-joined #saving a copy 
    for (j in 1:length(n.many)) {#walk through elements of n.many 

     joinedAux$fin<-gsub(as.character(n.many[j]), "other", as.character(joined$fin))#substitute (not working) 

    } 

И он приходит с этим предупреждением: «количество элементов для замены не кратна длине замены»

он ничего не делает, когда Я смотрю «joinAux $ fin», это то же самое, что «присоединяется к $ fin». Вот пример:

Joined$codigo Joined$fin 
12    12 valid high 
22    22 wrong un 
23    23 wrong in 
13    13 valid high 
15    15 valid very high 

Что мне нужно, чтобы это было после замены:

Joined$codigo Joined$fin 
    12    other valid high #codigo in n.many 
    22    22 wrong un 
    23    other wrong in #codigo in n.many 
    13    other valid high #codigo in n.many 
    15    15 valid very high 

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

ответ

1

Если я правильно понимаю вашу проблему, вам нужно будет прокрутить свой файл data.frame, а не подмножество строк.

joinedAux$fin <- sapply(1:nrow(joinedAux), function(j) if(joined1$codigo[j] %in% n.many) gsub(joined1$codigo[j],'other',joined1$codigo[j]) else joined1$codigo[j]) 

Если вы не знакомы с sapply, для цикла будет работать тоже:

fin <- NULL 
for(j in 1:nrow(joinedAux)) fin[j] <- if(joined1$codigo[j] %in% n.many) gsub(joined1$codigo[j],'other',joined1$codigo[j]) else joined1$codigo[j]) 

Если вы счастливы, чтобы избежать GSUB (который не работает с векторами), самый простой способ вероятно, будет:

joinedAux$fin <- joined1$codigo 
joinedAux$fin[which(joined1$codigo %in% n.many)] <- 'other' 
+0

Я понимаю, что вы имеете в виду (правда, если я ошибаюсь), эта реализация перезапишет данные, уже сохраненные в $ fin, верно? например, «12 действительных максимумов не обработанных данных. Кадр будет« другим », но не« другим действительным высшим ».« Правильно ли я? – Amnor

+0

Это правильно. Если вы хотите добавить «действительный высокий», проверьте 'str_replace' из пакета stringr. Это может обрабатывать векторы, и вы можете использовать, если для последнего решения. – jkt

+0

Я попробую, я сообщу результаты, спасибо! – Amnor