2015-02-04 3 views
1

Мне нужно было бы заменить уровни нескольких факторов в одном фрейме данных, чтобы они были унифицированы. Они, например, уровни в одном из этих факторов:Замена уровней нескольких факторов

> levels(workco[,5]) 
[1] " "        "1"        "2"        
[4] "kóko"       "kesätyö"      "Kesätyö kokoaika"    
[7] "koko"       "kokop"       "kokop."       
[10] "Kokopäivä"     "kokopäiväinen"    "Kokopäiväinen"    
[13] "kokopäiväinen/osa-aikainen" "kokopäivänen"     "kokp"       
[16] "kokp."       "Kokp."       "osa-aik"      
[19] "Osa-aik/Kokopäiv."   "osa-aik."      "Osa-aik."      
[22] "osa-aikainen"     "Osa-aikainen"     "osa-aikainen/kokopäiväinen" 
[25] "Osa/kokoaikainen"    "Osap."     

Скажут, у меня есть 12 столбцов, которые являются всеми факторами, и они имеют разные названия уровней, относящиеся к тем же значениям выраженно по-разному: как вы могут видеть из примера, многие из них показывают одинаковые буквы в названиях уровней: koko, kok, kokop ... Есть три уровня, которые я хочу получить, объединив: kokop, и kes. Также уровни, названные в честь номеров 1 и 2, должны быть перекодированы в kokop и osa соответственно.

До сих пор все, что я пробовал, не работает, я боюсь, что это потому, что я думаю более сложным способом, чем это на самом деле: я пробовал циклы, используя функцию adist(), а также grep() отдельно, но я получаю найти ошибки. Например:

code <- c("kok","osa","ma","kes",1,2," ") 
list.names <- c("1", "2", "3", "4", "5", "6","7","8","9","10","11","12") 
mylist <- vector("list", length(list.names)) 
names(mylist) <- list.names 
D <- mylist 
index <- mylist 

for (i in ncol(workco2)){        
    D[[i]] <- adist(workco2[,i],code,ignore.case=TRUE) 
    index[[i]] <- lapply(D[[i]],which.min) 
    workco2[,i] <- data.frame(code[index[[i]]]) 
} 

и это сообщение об ошибке:

Error in code[index[[i]]] : invalid subscript type 'list' 

Не могли бы вы быть так добры намекнуть мне, как бы вы ее решить? Наверное, намного проще, чем я думаю =/Спасибо заранее!

+2

[Минимальная воспроизводимая пример] (http://stackoverflow.com/a/5963610/1412059) и ожидаемые результаты, пожалуйста , Что нужно делать со смешанными уровнями, такими как «kokopäiväinen/osa-aikainen»? – Roland

+0

Извините, Роланд, просто вставил сообщение об ошибке. Смешанные уровни должны быть закодированы как «osa», или «kes», если они появятся, будучи выбраны «kes», если osa/kes показывают вместе. –

+0

@ Джина Цеткин. Помогли ли наши ответы? –

ответ

0

Это мое предположение, что вам нужно сочетание Grep & заменить. Это может ускорить изменение уровней с помощью похожих слогов («ko», «kok»).

Пример данных

code <- as.factor(c("kok","osa","ma","kes", "koko", "osa-aikainen", "osa/kes")) 

Добавить уровень

levels(code) <- c(levels(code), "kokop") 

Заменить все экземпляры, содержащие "кок" с "kokop"

new.code <- replace(code, (grep ("kok", code)), "kokop") 

Заменить все экземпляры, содержащие "ОСА/KES" с "KES"

new.code <- replace(code, (grep ("osa/kes", code)), "kes") 

использовать более короткие строки, для бывших. «Ко», чтобы изменить уровни с аналогичными слогов («Ко», «кок»)

new.code <- replace(code, (grep ("ko", code)), "kokop") 
+0

Спасибо, Рутгер! Это будет работать! : D –

1

Я обычно объединяю факторы, как показано в примере ниже. I уровни подмножества, соответствующие моему критерию (... %in% c(...)) и перезаписывают их на новый уровень.

set.seed(357) 
xy <- data.frame(name = sample(letters[1:4], size = 20, replace = TRUE), value = runif(20)) 
xy$name 
    [1] a a b a c b d c d d c c b a c a b d c b 
    Levels: a b c d 
levels(xy$name)[levels(xy$name) %in% c("a", "b")] <- "a-b" 
levels(xy$name)[levels(xy$name) %in% c("c", "d")] <- "c-d" 
xy$name 
[1] a-b a-b a-b a-b c-d a-b c-d c-d c-d c-d c-d c-d a-b a-b c-d a-b a-b c-d c-d a-b 
Levels: a-b c-d 
Смежные вопросы