#r #dictionary
#r #словарь
Вопрос:
У меня возникли проблемы с использованием одной из map()
функций в r для вычисления корреляции между переменными во фрейме данных. Вопрос в том, «используйте одну из функций map для вычисления корреляции Пирсона между гепатитом А и каждым из других 6 заболеваний и возвращайте двойной вектор в качестве выходных данных».
Данные показывают ежегодный уровень заболеваемости каждым заболеванием каждый год.
Я могу вычислить корреляцию между гепатитом А и другими заболеваниями с помощью cor()
функции, но есть ли способ использовать одну из map()
функций для вычисления корреляции?
cor(US_incidence$`Hepatitis A`, US_incidence$Measles, method = "pearson", use = "complete.obs")
cor(US_incidence$`Hepatitis A`, US_incidence$Mumps, method = "pearson", use = "complete.obs")
cor(US_incidence$`Hepatitis A`, US_incidence$Pertussis, method = "pearson", use = "complete.obs")
cor(US_incidence$`Hepatitis A`, US_incidence$Polio, method = "pearson", use = "complete.obs")
cor(US_incidence$`Hepatitis A`, US_incidence$Rubella, method = "pearson", use = "complete.obs")
cor(US_incidence$`Hepatitis A`, US_incidence$Smallpox, method = "pearson", use = "na.or.complete")
Ответ №1:
Вы можете map
напрямую использовать подмножество фрейма данных, поскольку фреймы данных представляют собой списки векторов, а map может выполнять итерации по спискам:
map(your_data_frame[,-c(1,2)], #every column except year and Hep A
~ cor(US_incidence$`Hepatitis A`, ., method = "Pearson", use = "complete.obs")
Обратите внимание, что если вы хотите изменить свой аргумент ‘use’, как вы делаете выше, вам нужно создать список символьных строк для этой цели и использовать map2
.
Вы также можете рассмотреть возможность использования dplyr::summarise()
с dplyr::across()
require(dplyr)
your_data_frame %>%
select(-year) %>% #don't need year column
ungroup() %>% # make sure d.f isn't grouped
summarise(across(everything(), function(x){
cor(`Hepatitis A`, x, method = "Pearson", use = "complete.obs")
})) -> correlations
Выше приведен Hepatitis A
столбец, который показывает корреляцию с самим собой, но вы можете просто удалить его, если хотите.
Комментарии:
1. Большое спасибо! Этот первый код был тем, что я искал! У меня также есть еще один вопрос. Для каждого из 7 заболеваний, как мне использовать циклы или функции отображения, чтобы найти наиболее положительно (pearson’s) коррелированное заболевание (кроме самого себя) и соответствующую корреляцию?
2. Используйте
cor.test
вместоcor
— вместо длины-один двойной, он возвращает список. Значение presult$p.value
равно, а значение равноresult$estimate
Ответ №2:
Вы можете создать вектор имен столбцов, к которому хотите применить cor
функцию, а затем использовать map_dbl
его для получения двойного вектора.
cols <- c('Measles', 'Mumps', 'Pertussis', 'Polio', 'Rubella', 'Smallpox')
result <- purrr::map_dbl(cols,
~cor(US_incidence$`Hepatitis A`, US_incidence[[.x]],
method = "pearson", use = "complete.obs"))