#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))