Применение меток факторов на основе условия в R

#r

Вопрос:

У меня есть набор данных с переменной «образование», которая кодируется по-разному в каждой из трех включенных стран, например:

Код Страна 1 Страна 2 Страна 3
1 Никакого образования Никакого образования Никакого образования
2 Первичный Первичный Исламское образование
3 Вторичный Вторичный Первичный
4 NA NA Вторичный

Мне нужно применить уровни факторов, которые различны для каждой страны.

Ниже приведена моя попытка, но, похоже, она не работает:

 df <- data.frame(
  Country = sample(c("Country 1", "Country 2", "Country 3"), 100, replace = TRUE), 
  Education_1 = sample(1:4)
)

df$Education <- 
  if(df$Country == "Country1") {
    factor(df$Education,
           levels = c(1:4),
           labels = c("No education", "Primary", "Secondary", "NA"))
  } else if (df$Country == "Country2") {
    factor(df$Education,
           levels = c(1:4),
           labels = c("No education", "Primary", "Secondary", "NA"))
  } else {
    factor(df$Education, 
           levels = c(1:4), 
           labels = c("No education", "Islamic education", "Primary", "Secondary")
    )
  }

 

Спасибо

Комментарии:

1. Выбранный подход, вероятно, зависит от того, что вы хотите сделать с данными и факторами? Если бы вы могли поделиться этим, это было бы полезно. Обычно это переводится в длинный формат, поэтому вам нужна только одна переменная со значениями образования, и вы можете управлять этим с помощью 5 уровней.

2. Мне нужно применить уровни к фактору для описательного/ модельного анализа. Проблема, которую я пытаюсь преодолеть, заключается в том, что код 2 (например) означает что-то другое в зависимости от страны, поэтому мне интересно, как это объяснить

3. может быть, использование пятиуровневого кода в соответствии c(1 = "No education", 2 = "Islamic education", 3 = "Primary", 4 = "Secondary", 999 = NA) с этим решит проблему?

4. Да, это было бы идеально — но я унаследовал этот файл с фанковым кодированием — я могу разделить страны, применить уровни в зависимости от страны и объединить

Ответ №1:

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

Затем используйте левое соединение с двумя столбцами фрейма данных со странами и кодами образования.

Вы можете использовать полученный столбец с типом образования в качестве строки, или коды могут быть перекодированы для обеспечения согласованности.

 library(dplyr)
library(tidyr)
library(stringr)


df <- data.frame(
  Country = sample(c("Country 1", "Country 2", "Country 3"), 100, replace = TRUE), 
  Education_1 = sample(1:4))


df_ed <- structure(list(Code = 1:4, Country.1 = c("No education", "Primary", 
                                                      "Secondary", NA), Country.2 = c("No education", "Primary", "Secondary", 
                                                                                      NA), Country.3 = c("No education", "Islamic education", "Primary", 
                                                                                                         "Secondary")), class = "data.frame", row.names = c(NA, -4L)) 

df_levels  <-  
  df_ed %>% 
  pivot_longer(-Code) %>% 
  mutate(name = str_replace(name, "\.", " "))

df1 <- 
  df %>% 
  left_join(df_levels, by = c("Country" = "name", "Education_1" = "Code"))

head(df1)
#>     Country Education_1        value
#> 1 Country 1           3    Secondary
#> 2 Country 2           4         <NA>
#> 3 Country 3           1 No education
#> 4 Country 1           2      Primary
#> 5 Country 3           3      Primary
#> 6 Country 2           4         <NA>
 

Создано 2021-09-22 пакетом reprex (v2.0.0)