R: Как применить функцию, которая выводит фрейм данных для нескольких столбцов (используя dplyr)?

Я хочу найти корреляции, p-значения и 95% CI между одним определенным столбцом и всеми другими столбцами в кадре данных. Пакет «метла» предоставляет пример того, как сделать это между двумя столбцами, используя cor.test с dplyr и pipe. Для mtcars и, скажем, столбца mpg мы можем выполнить корреляцию с другим столбцом:

library(dplyr)
library(broom)
mtcars %>% do(tidy(cor.test(.$mpg, .$cyl)))

estimate statistic      p.value parameter   conf.low  conf.high
1 -0.852162 -8.919699 6.112687e-10        30 -0.9257694 -0.7163171

Выходные данные представляют собой однострочный кадр данных. Я хотел бы запустить cor.test для mpg с каждым столбцом и отправить вывод в отдельную строку. Когда столбец mpg связан со всеми остальными столбцами, желаемый результат будет выглядеть следующим образом:

    estimate statistic      p.value parameter   conf.low     conf.high
cyl  -0.852162  -8.919699 6.112687e-10       30 -0.9257694 -0.7163171
disp -0.8475514 -8.747152 9.380327e-10       30 -0.9233594 -0.7081376
hp   -0.7761684 -6.742389 1.787835e-07       30 -0.8852686 -0.5860994
drat  0.6811719  5.096042 1.77624e-05        30 0.4360484  0.832201
wt   -0.8676594 -9.559044 1.293959e-10       30 -0.9338264 -0.7440872
qsec  0.418684   2.525213 0.01708199         30 0.08195487 0.6696186
vs    0.6640389  4.864385 3.415937e-05       30 0.410363 0.8223262
am    0.5998324  4.106127 0.0002850207       30 0.3175583  0.784452
gear  0.4802848  2.999191 0.005400948        30 0.1580618 0.7100628
carb -0.5509251  -3.61575 0.001084446        30 -0.754648 -0.2503183

Обратите внимание на добавленные имена строк в первом столбце. Они показывают, какой столбец был связан с mpg для cor.test. В идеале я хотел бы сделать это с dplyr и трубами.

Ответы на вопрос(1)

Решение Вопроса

Вот решение, которое придерживаетсяdo подход. Шаг, который вам не хватает, это собрать ваши данные, а затем сгруппировать по переменной.

library(dplyr)
library(tidyr)
library(broom)

mtcars %>%
  gather(var, value, -mpg) %>%
  group_by(var) %>%
  do(tidy(cor.test(.$mpg, .$value))) %>%
  ungroup() %>%
  mutate(var = factor(var, names(mtcars)[-1])) %>%
  arrange(var)

И вот пример, который больше подходит для базового подхода R (хотя я использовал трубы для удобства, но он легко адаптируется)

library(dplyr)
library(broom)

xvar <- "mpg"
yvar <- names(mtcars)[!names(mtcars) %in% xvar]

lapply(yvar,
       function(yvar, xvar, DF)
       {
         cor.test(DF[[xvar]], DF[[yvar]]) %>%
           tidy()
       },
       xvar,
       mtcars) %>%
  bind_rows() %>%
  mutate(yvar = yvar) %>%
  select(yvar, estimate:conf.high)
 Benjamin18 июн. 2016 г., 17:41
Да, это правильно. Это просто вопрос, если вы хотите, чтобы они в том же порядке, в котором они появляются, я исходные данные
 Irakli18 июн. 2016 г., 16:30
Спасибо, @Bejnamin, за такое краткое и ясное решение! Как я понимаю, вы достигаете главной цели всего тремя каналами: mtcars%>% collect (var, value, -mpg)%>% group_by (var)%>% do (tidy (cor.test (. $ Mpg,. $ value)). Остальная часть кода просто отсортирована по var.

Ваш ответ на вопрос