Проблема: у меня опрос из 100 вопросов. Они могут иметь 5 типов ответов, которые я сгруппировал и суммировал в отдельные таблицы (в виде списка). В каждой таблице разное количество столбцов с разными именами переменных.
ДАННЫЕ ОБРАЗЦА:
tbl1 <- tribble(~"stakeholder", ~"Question", ~"1-Little", ~"2", ~"3", ~"4-Much", ~"Do not know/ Not applicable", ~"no_response",
"SH_1", "QUESTION 2", 2, 1, 4, 8, 1, 1,
"SH_2", "QUESTION 2", 2, 1, 4, 8, 1, 1,
"SH_3", "QUESTION 2", 2, 1, 4, 8, 1, 1,
"SH_4", "QUESTION 2", 2, 1, 4, 8, 1, 1,
)
tbl2 <- tribble(~"stakeholder", ~"Question", ~"1-Little", ~"2", ~"3", ~"4-Much", ~"5-MuchMuch", ~"Do not know/ Not applicable", ~"no_response",
"SH_1", "QUESTION 2", 2, 1, 4, 8, 1, 1,2,
"SH_2", "QUESTION 2", 2, 1, 4, 8, 1, 1,2,
"SH_3", "QUESTION 2", 2, 1, 4, 8, 1, 1,2,
"SH_4", "QUESTION 2", 2, 1, 4, 8, 1, 1,2
)
Проблема: как рассчитать пропорции на основе суммы? Мне нужно создать таблицы пропорций на основе общего количества ответов на каждый вопрос.
Я создаю указанные выше значения в образцах таблиц из ответов персонажей путем подсчета на основе сгруппированной переменной. Замечу, что у меня есть 6 различных способов группировки и воспроизведения графики и таблиц (всего нужно около 600!):
tally_function <- function(tbl) {
tbl %>%
gather(key = Question, value = Response,
12:length(.)) %>%
group_by(stakeholder, Question, Response) %>%
tally %>%
spread(Response, n, fill = 0) %>%
select(stakeholder, Question, everything(), no_response = `<NA>`) %>%
arrange(Question)
}
Предыдущая функция, которую я использовал, вызывала имена отдельных столбцов для получения сумм, но здесь это не сработает, поскольку имена столбцов в каждой таблице разные:
Prop_Function_Group1 <- function(tbl){
tbl %>%
summarise(`Number of Responses (Count)` = sum(`1-Little` + `2`+`Do not know/ Not applicable`+
`3`+`4-Much` + no_response, na.rm = TRUE),
`1-Little`= sum(`1-Little`/`Number of Responses (Count)`, na.rm = TRUE) * 100,
`2` = sum(`2` / `Number of Responses (Count)`, na.rm = TRUE) * 100,
`Do not know/ Not applicable` = sum(`Do not know/ Not applicable` / `Number of Responses (Count)`, na.rm = TRUE)* 100,
`3` = sum(`3` / `Number of Responses (Count)`, na.rm = TRUE) * 100,
`4-Much` = sum(`4-Much` / `Number of Responses (Count)`, na.rm = TRUE) * 100,
`no_response` = sum(no_response / `Number of Responses (Count)`, na.rm = TRUE) * 100
) %>%
mutate_if(is.numeric, round, digits = 2) %>%
arrange(desc(`Number of Responses (Count)`))
}
В настоящее время у меня есть это, но считаю, что мне понадобится какой-то цикл ifelse / case_when (), основанный на именах (tbl), но я действительно новичок в программировании и не уверен, с чего начать. Имена столбцов в функции суммирования должны совпадать с именами входной таблицы, которую они также суммируют.
prop_function <- function(tbl){
tbl %>%
summarise(`Number of Responses` = sum(3:length(.), na.rm = TRUE))
}
Мне не нужно полное решение, полезны любые небольшие идеи и предложения. Если это дублированный тип вопроса, будем благодарны за то, чтобы направить его в правильном направлении.
Я также добавляю их впоследствии в purr :: map () + ggplot (), поэтому оцените, если решения несколько удобны для tidyverse.
Ваше здоровье.