Как объединить два значения в 1 переменной в r?

#r

#r

Вопрос:

У меня есть эта переменная ‘country’

df

 id age  country 
1  21   Denmark 
2  20   Sweden  
3  20   Sweden  
4  21   NA   
5  22   Other  
  

Это то, что я хочу

 df
id age  country new
1  21   Denmark  1
2  20   Sweden   2
3  20   Sweden   2
4  21   NA       0
5  22   Other    0
  

Я хочу, чтобы Дания была закодирована как 1, а Швеция — как 2, а NA Other — как 0. Как мне это сделать в r?

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

1. Пожалуйста, попробуйте поделиться воспроизводимым примером и ожидаемым результатом. Не уверен в структуре вашего фрейма данных, но посмотрите, работает ли это: df $Country_code <- ifelse(df $Country == ‘Дания’, 1, ifelse(df $Country == ‘Швеция’, 2, 0))

2. Я пытался, но это мой первый раз, поэтому я не знаю, как правильно опубликовать df. Ваш код сработал, но NA не помечен как 0, все еще NA.

3. Вы можете использовать dput(df).

Ответ №1:

Это должно сработать:

 library(dplyr)
library(tibble)
df <- tibble::tribble(
  ~d, ~age, ~country, 
  1, 21, "Denmark", 
  2, 20, "Sweden",  
  3, 20, "Sweden",  
  4, 21, NA,
  5, 22, "Other")
df <- df %>% mutate(new = case_when(
  country == "Sweden" ~2, 
  country == "Denmark" ~ 1, 
  TRUE ~ 0))
  
df
# # A tibble: 5 x 4
#      d   age country   new
#   <dbl> <dbl> <chr>   <dbl>
# 1     1    21 Denmark     1
# 2     2    20 Sweden      2
# 3     3    20 Sweden      2
# 4     4    21 NA          0
# 5     5    22 Other       0
  

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

1. Спасибо! Но NA по-прежнему NA: (

2. @Quinn Не уверен, почему, это сработало в моем коде. Можете ли вы отредактировать свой вопрос, чтобы добавить то, что вы пробовали, и результат?

3. Извините, я ввел неправильно. Это сработало! 🙂 Большое вам спасибо! 🙂

Ответ №2:

Это был бы подход с datatable:

 library(data.table)
library(dplyr)

df <- setDT(df)

df <- df[,`:=`(
  new = case_when(
    country == "Sweden" ~1, 
    country == "Denmark" ~ 2, 
    TRUE ~ 0)
)]
  

Ответ №3:

Вот base способ R:

 corr <- data.frame(country = c("Denmark", "Sweden", NA_character_, "Other"),
                   new = c(1, 2, 0, 0))

merge(df, corr, by = "country")
  

Вывод:

 > merge(df, corr, by = "country")
  country id age new
1 Denmark  1  21   1
2   Other  5  22   0
3  Sweden  2  20   2
4  Sweden  3  20   2
5    <NA>  4  21   0
  

Данные:

 df <- structure(list(id = 1:5, age = c(21L, 20L, 20L, 21L, 22L), country = c("Denmark", 
                                                                             "Sweden", "Sweden", NA, "Other")), class = "data.frame", row.names = c(NA, 
                                                                                                                                                    -5L))