2015-07-15 6 views
0

Я пытаюсь вычислить матрицу корреляции при различных поднаборах кадра данных. Я нашел этот фрагмент кода для вычисления корреляции между 2-х переменными в кадре данных:Агрегированная корреляция (R :: dplyr)

library(dplyr) 
mtcars %>% group_by(cyl) %>% summarise(V1=cor(hp,wt)) 

Но я хотел бы, чтобы вычислить матрицу корреляции между несколькими переменными, в кадре данных. Я бы хотел, чтобы это возвращалось (желательно) в виде списка корреляционных матриц. Что-то вроде:

mtcars %>% group_by(cyl) %>% cor(data.frame(hp,wt,qsec) 

Могу ли я сделать это с помощью dplyr?

+0

Рассчитывается корреляция между 'hp' и' wt' для каждого отдельного 'cyl'. –

ответ

3

На мой взгляд хороший старый by или dlply лучше, но если вы действительно хотите использовать dplyr, я думаю, что вы можете использовать do:

o <- mtcars %>% group_by(cyl) %>% do(cor=cor(cbind(.$hp, .$wt, .$qsec))) 
# Source: local data frame [3 x 2] 
# Groups: <by row> 

# cyl  cor 
# 1 4 <dbl[3,3]> 
# 2 6 <dbl[3,3]> 
# 3 8 <dbl[3,3]> 

где . относится к отфильтрованной dataframe. Тогда вы могли бы сделать o$cor[1] и т. Д. Я не уверен, как просто получить вывод списка из dplyr, а не вывод dataframe.


Использование plyr:

library(plyr) 
dlply(mtcars, .(cyl), function (x) cor(x[, c('hp', 'wt', 'qsec')])) 

Использование базового R и by:

o <- by(mtcars[, c('hp', 'wt', 'qsec')], mtcars$cyl, cor, simplify=F) 

o имеет класс by, но ?by говорит, что это в основном списке.

length(o) # 3 
names(o) # "4" "6" "8" (i.e. the cyl values) 
o[[1]] # =cor(hp, wt, qsec) where cyl==4 
+1

Большое спасибо. Этот ответ был очень всеобъемлющим @ Mathematical.coffee. Я не привержен dplyr, я просто пытаюсь изучить его в данный момент. Возможно, однажды я перейду на стадию просветления, где все манипуляции с данными сводятся к базовым командам R. :) – user3030872

+0

'do.call (rbind, lapply (o, \' [\ ', lower.tri (o [[1]])))' или что-то подобное после вызова 'by' позволит двумерные корреляции с сообщать по одному для каждой группы. – thelatemail

Смежные вопросы