Кодирование многорасовой категории в R - PullRequest
4 голосов
/ 22 апреля 2020

В моем фрейме данных опроса у меня есть несколько столбцов, соответствующих каждой расе / этнической категории (например, азиат, черный, латиноамериканец / латиноамериканец, белый и т. Д. c.), Причем каждый столбец кодируется как 'Y' или 'N ».

Я решил закодировать одну переменную, используя следующий синтаксис:

#Race coding into single variable
dd$Race[dd$Race_Asian=='Y'] <- 'Asian'
dd$Race[dd$Race_Black=='Y'] <- 'Black'
dd$Race[dd$Race_Hispanic=='Y'] <- 'Hispanic/Latinx'
dd$Race[dd$Race_Middle.Eastern=='Y'] <- 'Middle Eastern'
dd$Race[dd$Race_Native.American=='Y'] <- 'Native American'
dd$Race[dd$Race_Native.Hawaiian=='Y'] <- 'Native Hawaiian'
dd$Race[dd$Race_White=='Y'] <- 'White/Caucasian'
dd$Race[dd$Race_Other=='Y'] <- 'Other'

dd$Race <- as.factor(dd$Race)

Итак, как мне кодировать многорасовую категорию для dd $ Race?

Ответы [ 3 ]

0 голосов
/ 22 апреля 2020

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

library(data.table)

dt <- data.table(Race_Asian = c("Y","N","N"),
                 Race_Black=c('N',"Y","N"),
                Race_Hispanic = c("N","Y","Y"))
dt[,id:=.I]

# example table
dt
#>    Race_Asian Race_Black Race_Hispanic id
#> 1:          Y          N             N  1
#> 2:          N          Y             Y  2
#> 3:          N          N             Y  3

#reshape solution

ldt <- melt(dt, id.vars = "id",variable.name = "Race_col",value.name = "Response")
ldt
#>    id      Race_col Response
#> 1:  1    Race_Asian        Y
#> 2:  2    Race_Asian        N
#> 3:  3    Race_Asian        N
#> 4:  1    Race_Black        N
#> 5:  2    Race_Black        Y
#> 6:  3    Race_Black        N
#> 7:  1 Race_Hispanic        N
#> 8:  2 Race_Hispanic        Y
#> 9:  3 Race_Hispanic        Y

ldt[,Race1:=fifelse(Response=="Y",sub("Race_","",Race_col),NA_character_)]

ldt[,Race:=paste0(Race1[!is.na(Race1)],collapse = "|"),by=.(id)]

ldt
#>    id      Race_col Response    Race1           Race
#> 1:  1    Race_Asian        Y    Asian          Asian
#> 2:  2    Race_Asian        N     <NA> Black|Hispanic
#> 3:  3    Race_Asian        N     <NA>       Hispanic
#> 4:  1    Race_Black        N     <NA>          Asian
#> 5:  2    Race_Black        Y    Black Black|Hispanic
#> 6:  3    Race_Black        N     <NA>       Hispanic
#> 7:  1 Race_Hispanic        N     <NA>          Asian
#> 8:  2 Race_Hispanic        Y Hispanic Black|Hispanic
#> 9:  3 Race_Hispanic        Y Hispanic       Hispanic

# you can join result back
dt[ldt[,.(Race),by=.(id)],Race:=i.Race,on=.(id)]
dt
#>    Race_Asian Race_Black Race_Hispanic id           Race
#> 1:          Y          N             N  1          Asian
#> 2:          N          Y             Y  2 Black|Hispanic
#> 3:          N          N             Y  3       Hispanic

Создано в 2020-04-22 с помощью пакета Представить (v0.3.0)

0 голосов
/ 22 апреля 2020

простой dplyr:

library(dplyr)

df <- data.frame(ID= 1:3,Race_Asian = c("Y","N","N"),
                 Race_Black=c('N',"Y","N"),
                 Race_Hispanic = c("N","Y","Y"))

#    ID Race_Asian Race_Black Race_Hispanic
# 1  1          Y          N             N
# 2  2          N          Y             Y
# 3  3          N          N             Y

df %>%
  pivot_longer(Race_Asian:Race_Hispanic) %>%
  group_by(ID, value) %>% 
  summarise(Race = paste(name, collapse=" & ")) %>% 
  filter(value=="Y") %>% 
  select(-value)


# A tibble: 3 x 2
# Groups:   ID [3]
#     ID Race                     
#  <int> <chr>                    
#1     1 Race_Asian               
#2     2 Race_Black & Race_Hispanic
#3     3 Race_Hispanic  

0 голосов
/ 22 апреля 2020

короткий ответ: просто объедините два отчета с '&'

Длинный ответ: пример использования mtcars:

Я хочу знать, является ли автомобиль, который я намереваюсь купить, мощным, но экономичным c, поэтому: автомобиль, который я хочу, имеет 6 или более цилиндров и 150+ лошадиных сил и должен go превышать 18 миль на галлон

Я объединяю три параметра в [скобках] с '&' и задаю значение "nice"

mtcars$economic <- ""
mtcars$economic[mtcars$cyl >= 6 & mtcars$hp >= 150 & mtcars$mpg > 18 ] <- "nice"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...