Объединение всех отметок, которые применяют переменные расы / этнической принадлежности, в одну категорию в R - PullRequest
0 голосов
/ 11 июля 2020

Ниже приведен пример структуры моего набора данных с белым, азиатским, черным и другими в качестве двоичных переменных. Я хотел бы создать новую переменную с именем «race_category», где, если кто-то выбрал более одной категории расы, ему будет назначено «более 1», в противном случае им будет назначена выбранная гонка.

white <- c(0,1,1,1,0,0,0,1,0,1)
asian <- c(0,0,0,1,0,1,1,0,0,0)
black <- c(1,1,1,1,0,0,0,0,1,0)
other <- c(0,0,0,0,1,0,0,0,0,0)

dat <- data.frame(white,asian,black,other)
dat

Это пример того, что я хотел бы получить на выходе:

race_cat <- c("black","more than 1","more than 1","more than 1","other","asian","asian","white","black","white")

dat <- data.frame(white,asian,black,other,race_cat)

dat

Любая помощь будет очень принята! Я новичок в R и понятия не имею, как к этому подойти ...

Ответы [ 3 ]

0 голосов
/ 11 июля 2020

Вы можете использовать базовые R apply() для этого:

dat$race_cat <- apply(dat, 1, function(x) {ifelse(sum(x) > 1, "more than 1", names(x[x != 0]))})

Вы применяете функцию к строкам:

  1. проверьте, равна ли сумма больше 1, то это "more than 1"
  2. , если сумма не больше 1, то это имя столбца с ненулевым значением.

Результат:

#>    white asian black other    race_cat
#> 1      0     0     1     0       black
#> 2      1     0     1     0 more than 1
#> 3      1     0     1     0 more than 1
#> 4      1     1     1     0 more than 1
#> 5      0     0     0     1       other
#> 6      0     1     0     0       asian
#> 7      0     1     0     0       asian
#> 8      1     0     0     0       white
#> 9      0     0     1     0       black
#> 10     1     0     0     0       white

(Обратите внимание, что это решение хорошо работает, если у вас есть только нули и единицы в ваших данных при суммировании строки - иначе вам придется использовать другое условие, чтобы проверить это. Если у вас есть строка только с нулями, этот код вернет NA для этой строки.)

Данные

dat <-structure(list(white = c(0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0), asian = c(0, 
0, 0, 1, 0, 1, 1, 0, 0, 0, 0), black = c(1, 1, 1, 1, 0, 0, 0, 
0, 1, 0, 0), other = c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0)), class = "data.frame", row.names = c(NA, 
-11L))
0 голосов
/ 11 июля 2020

Вы можете использовать max.col, чтобы выбрать столбец с «1», если нет нескольких «1».

library(dplyr)
dat %>%
  mutate(
    race_cat = ifelse(
      rowSums(.) > 1, "multiple", names(dat)[max.col(.)]))

   white asian black other race_cat
1      0     0     1     0    black
2      1     0     1     0 multiple
3      1     0     1     0 multiple
4      1     1     1     0 multiple
5      0     0     0     1    other
6      0     1     0     0    asian
7      0     1     0     0    asian
8      1     0     0     0    white
9      0     0     1     0    black
10     1     0     0     0    white
0 голосов
/ 11 июля 2020

Используя dplyr::case_when, вы можете установить свои условия для создания необходимой переменной


library(dplyr)

dat %>% 
  mutate(race_cat = rowSums(.),
         race_cat = case_when(race_cat == 1 & white == 1 ~ "white",
                         race_cat == 1 & asian == 1 ~ "asian",
                         race_cat == 1 & black == 1 ~ "black",
                         race_cat == 1 & other == 1 ~ "other",
                         TRUE ~ "more than 1"))
#>    white asian black other          race_cat
#> 1      0     0     1     0        black
#> 2      1     0     1     0  more than 1
#> 3      1     0     1     0  more than 1
#> 4      1     1     1     0  more than 1
#> 5      0     0     0     1        other
#> 6      0     1     0     0        asian
#> 7      0     1     0     0        asian
#> 8      1     0     0     0        white
#> 9      0     0     1     0        black
#> 10     1     0     0     0        white

Создано 11.07.2020 с помощью пакета (v0.3.0 )

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