Вложенный оператор ifelse с несколькими столбцами - PullRequest
0 голосов
/ 12 марта 2019

У меня есть набор данных, который включает (среди прочих многих переменных) 5 столбцов, указывающих страну, из которой получены данные, закодированные в виде числа. Я хотел бы создать новую переменную с указанием страны в виде простого текста (например, Испания вместо 312).

Вот пример данных с 5 строками и 2 столбцами для воспроизводимости:

c <- structure(list(CountryAP = structure(c(109, NA, 124, NA, NA), label = "Country of the Child Helpline (Asia Pacific region)", labels = c(Afghanistan = 109,  `New Zealand` = 124), class = "haven_labelled"), 
           CountryEr = structure(c(NA, 313, NA, 287, 278), label = "Country of the Child Helpline (Europe region)", labels = c( Azerbaijan = 278, Finland = 287, Sweden = 313), class = "haven_labelled")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -5L))

Я хочу вычислить новую переменную (называемую Страна ) со всеми странами, извлеченными из чисел из переменных, называемых CountryAP и CountryEr .

Я пробовал это:

c <- c %>%   mutate(Country = ifelse(CountryAP == 109, 'Afghanistan', ifelse(CountryAP == 124, 'New Zealand', ifelse(CountryEr == 313, 'Sweden', ifelse(CountryEr == 287, 'Finland', ifelse(CountryEr == 278, 'Azerbaijan','N/A'))))))

Но хотя он правильно вычисляет строки, содержащие значения в первой переменной (CountryAP), он игнорирует информацию о второй переменной (CountryEr) и дает мне только следующее:

   CountryAP    CountryEr     Country
1  109          NA            Afghanistan
2  NA           313           NA
3  124          NA            New Zealand
4  NA           287           NA
5  NA           278           NA

Когда я запускаю только часть CountryEr, она работает правильно.

Есть идеи, как сделать так, чтобы оператор ifelse согласился смотреть на другую переменную?

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Я могу придумать два способа сделать это. Сначала вы захотите объединить коды стран в один столбец:

c <- c %>% 
  mutate(CountryCode = ifelse(is.na(CountryAP), CountryEr, CountryAP))

  CountryAP CountryEr CountryCode
      <dbl>     <dbl>       <dbl>
1       109        NA         109
2        NA       313         313
3       124        NA         124
4        NA       287         287
5        NA       278         278

Использование dplyr::case_when

Эта функция позволяет нам указывать несколько условий, не путая вложенные структуры:

c <- c %>% 
  mutate(CountryName = case_when(
    CountryCode == 109 ~ 'Afghanistan',
    CountryCode == 124 ~ 'New Zealand',
    CountryCode == 313 ~ 'Sweden',
    CountryCode == 287 ~ 'Finland',
    CountryCode == 278 ~ 'Azerbaijan'
  ))

  CountryAP CountryEr CountryCode CountryName
      <dbl>     <dbl>       <dbl> <chr>      
1       109        NA         109 Afghanistan
2        NA       313         313 Sweden     
3       124        NA         124 New Zealand
4        NA       287         287 Finland    
5        NA       278         278 Azerbaijan 

Объединение дополнительной таблицы

Кроме того, вы можете хранить значения кода страны и названия страны в отдельной таблице и объединить их с первичными данными:

df.countries <- data.frame(
  CountryCode = c(109, 124, 313, 287, 278),
  CountryName = c('Afghanistan', 'New Zealand', 'Sweden', 'Finland', 'Azerbaijan')
)

  CountryCode CountryName
1         109 Afghanistan
2         124 New Zealand
3         313      Sweden
4         287     Finland
5         278  Azerbaijan

c <- c %>% 
  left_join(df.countries, by = 'CountryCode')

  CountryAP CountryEr CountryCode CountryName
      <dbl>     <dbl>       <dbl> <chr>      
1       109        NA         109 Afghanistan
2        NA       313         313 Sweden     
3       124        NA         124 New Zealand
4        NA       287         287 Finland    
5        NA       278         278 Azerbaijan 
0 голосов
/ 12 марта 2019

Спасибо, case_when действительно решил мою проблему:

c <- c %>%   mutate(Country = case_when(CountryAP == 109 ~ 'Afghanistan',
                         CountryAP == 124 ~  'New Zealand',
                         CountryEr == 313 ~ 'Sweden',
                         CountryEr == 287  ~ 'Finland',
                         CountryEr == 278 ~ 'Azerbaijan'))
...