Объединение нескольких столбцов для создания одной переменной

#r #multiple-columns #demographics

Вопрос:

Набор данных, который я использую, регистрирует этническую принадлежность респондентов. Ответы записываются по нескольким переменным, и респондентам было разрешено выбрать более одной. Пример:

 Black White Asian Hispanic 

1     NA    NA    NA

NA    1     NA    NA

NA    NA    NA    1

NA    NA    1     1

 

^^^В последней строке респондент выбрал бы азиата и латиноамериканца.

Что я хочу сделать, так это:

А) сверните эти столбцы в одну переменную этнической принадлежности, с разными номерами, представляющими разные этнические группы (т. Е. Черный будет 1, белый будет 2 и т.д.).

Б) сделайте так, чтобы любой, кто сообщил о нескольких столбцах, получил обозначение «несколько».

Я немного новичок в R, поэтому буду очень признателен за любую помощь!

Ответ №1:

Один из способов сделать это-преобразовать имена столбцов в столбец, сгруппировать значения по респондентам, а затем удалить значения NA. Затем просто выберите значение этнической принадлежности, которое остается для каждой группы, при необходимости переключаясь на «несколько». Вот способ сделать это с помощью tidyverse:

 library(tidyverse)

df %>% 
  rownames_to_column("respondent") %>% 
  pivot_longer(-respondent) %>% 
  group_by(respondent) %>% 
  filter(!is.na(value)) %>% 
  summarise(eth = ifelse(n() == 1, name, "multiple"))

# A tibble: 4 x 2
  respondent eth     
  <chr>      <chr>   
1 1          Black   
2 2          White   
3 3          Hispanic
4 4          multiple
 

Вы не сможете хранить числа в виде числовых типов со строкой типа «переменная» — так что у вас есть выбор. Либо придерживайтесь меток этнической принадлежности (как в решении выше), либо преобразуйте метки в числа, а затем числа в строковые представления этих чисел. Это кажется немного громоздким, но если вы хотите это сделать, вот как:

 df %>% 
  rownames_to_column("respondent") %>% 
  pivot_longer(-respondent) %>% 
  mutate(eth_num = as.character(as.numeric(fct_inorder(name)))) %>% 
  group_by(respondent) %>% 
  filter(!is.na(value)) %>% 
  summarise(eth = ifelse(n() == 1, eth_num, "multiple"))

# A tibble: 4 x 2
  respondent eth     
  <chr>      <chr>   
1 1          1       
2 2          2       
3 3          4       
4 4          multiple
 

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

1. Спасибо, ваше первое решение действительно работает, мы сделаем это для меня! Очень полезно.

Ответ №2:

Вот базовый вариант R —

 #Get the name of column with non-NA value
ethinicty <- names(df)[max.col(!is.na(df))]
#If there are more than 1 option selected change it to 'multiple'
ethinicty[rowSums(!is.na(df)) > 1] <- 'multiple'
ethinicty

#[1] "Black"    "White"    "Hispanic" "multiple"