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