2014-12-16 5 views
2

Переменная Language содержит 33 различных языковФакторинговые переменные в R

factor_language_var <- factor(Data$Language) 
summary(factor_language_var) 
ar ca cs da de el en en-gb en-GB es fi fr hi hu id it ja 
4  5  4  5 231  1 12067 229  2 121  8 206  2  2 34 45 48 

и т.д ...

Если я просто фактор переменной, очевидно, создает 33 уровней, которые мне не нужны. Как конкретно выбрать языки (значения) и создать уровень из них?

В частности, мне нужны en, en-gb и en-GB (английский) для формирования Уровня 1; nl (голландский) - Уровень 2; msa (малайский) - Уровень 3; ru (русский) - Уровень 4; и все другие языки, объединенные в качестве ссылочной категории.

Спасибо.

ответ

4

Функция переключатель может быть использован, но, к сожалению, не векторизованы так нужно «sapply» аргументы к нему:

x <- c("en","en-gb","en-GB","nl","msa","ru","other1","other2") 

sapply(x, function(z) switch(z, 
    'en'=, 'en-gb' =, 'en-GB'= "Level 1", 
    'nl'= "Level 2", 
    'msa' = "Level 3", 
    'ru' = "Level 4", 
     "All others")) 

Вы именованный вектор (подходит для подведения итогов) в результате :

  en  en-gb  en-GB   nl   msa 
    "Level 1" "Level 1" "Level 1" "Level 2" "Level 3" 
      ru  other1  other2 
    "Level 4" "All others" "All others" 

table(sapply(x, function(z) switch(z, 
     'en'=, 'en-gb' =, 'en-GB'= "Level 1", 
     'nl'= "Level 2", 
     'msa' = "Level 3", 
     'ru' ="Level 4", "All others"))) 

#All others Level 1 Level 2 Level 3 Level 4 
#   2   3   1   1   1 

Используется версия переключателя символов. Это немного чище, чем вложенный подход ifelse. Вероятно, также намного быстрее, так как вы не хотите создавать кучу вспомогательных векторов.

Если вы хотите сохранить значения NA_character_ как NA-х, то это удастся:

> sapply(x, function(z) switch(z, 
+  'en'=, 'en-gb' =, 'en-GB'= "Level 1", 
+  'nl'= "Level 2", 
+  'msa' = "Level 3", 
+  'ru' ="Level 4", 
+   'NA' = "NA", 
+    "All others")) 
      en  en-gb  en-GB   nl   msa 
    "Level 1" "Level 1" "Level 1" "Level 2" "Level 3" 
      ru  other1  other2   <NA> 
    "Level 4" "All others" "All others"   "NA" 
+0

Как и мой (теперь удаленный) ответ, это clobbers значения NA. Я еще не понял пути. – thelatemail

+0

Когда я помещал NA на входы, я получаю «Все остальные» (который, я полагаю, может или не желателен.) Я отправлю альтернативу: –

+0

@BondedDust Спасибо! Это сложнее, чем я ожидал. НС не проблема, так как я очищал свои данные заранее. – Zlo

1

Если мне не хватает чего-то очевидного, вы в основном спрашиваете, как определить уровни фактора?

Данные вашего примера не имеют всех 33 уровней, которые вы указываете в вопросе. Однако я добавил некоторые, на которые вы ссылались. По существу вам необходимо создать переменную в фреймворке данных, в котором есть информация о том, какой уровень фактора должен быть на каждом языке, а затем сделать фактор из этой переменной.

langs <- c("ar", "ca" ,"cs","da","de","el","en", "en-gb", "en-GB", "es", "fi", "fr", "hi", "hu", "id", "it", "ja", "msa", "nl", "ru") 
langs1 <- data.frame(langs=langs) 

langs1 

langs1$mylevels <- ifelse(langs=="en" | langs=="en-gb" | langs=="en-GB", "level1", 
         ifelse(langs=="nl", "level2", 
           ifelse(langs=="msa", "level3", 
             ifelse(langs=="ru", "level4", 
              "reference")))) 

langs1$mylevels <- as.factor(langs1$mylevels) 

str(langs1) #you can see that mylevels has the languages referenced in different factor levels 
+0

И в одной строке с dplyr: 'langs1 <-langs1 %>% мутировать (уровни = as.factor (IfElse (LANGS ==» en "| langs ==" en-gb "| langs ==" en-GB "," level1 ", ifelse (langs ==" nl "," level2 ", ifelse (langs ==" msa "," level3 " , ifelse (langs == "ru", "level4", "reference")))))) ' – zipp

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