2015-03-26 18 views
7

Tôi có khung dữ liệu được nhóm (sử dụng dplyr) với 50 cột số, được chia thành các nhóm bằng một trong các cột. Tôi muốn tính toán một ma trận tương quan giữa tất cả các cột không nhóm và một cột cụ thể.Ma trận tương quan của các biến nhóm trong dplyr

Một ví dụ với mtcars bộ dữ liệu:

data(mtcars) 
cor(mtcars[,2:11], mtcars[,2]) 

trả về một danh sách các mối tương quan giữa dặm mỗi thuyền buồm và các biến khác.

Hãy nói rằng tuy nhiên, tôi muốn để tính toán cùng sự tương quan này cho từng nhóm trụ, ví dụ .:

library(dplyr) 
mtcars <- 
    mtcars %>% 
    group_by(cyl) 

Làm thế nào tôi sẽ làm điều này? Tôi đang nghĩ đến một cái gì đó giống như

mtcars %>% 
    group_by(cyl) %>% 
    summarise_each(funs(cor(...)) 

Nhưng tôi không biết phải đặt trong ... như tôi không biết làm thế nào để xác định một cột trong chuỗi dplyr.

Liên quan: Linear model and dplyr - a better solution? có câu trả lời rất giống với câu trả lời của @ akrun. Đồng thời, trên xác thực chéo được xác thực: https://stats.stackexchange.com/questions/4040/r-compute-correlation-by-group có các giải pháp khác sử dụng các gói không phải là dplyr.

Trả lời

8

Chúng tôi có thể sử dụng do.

library(dplyr) 
mtcars %>% 
     group_by(cyl) %>% 
     do(data.frame(Cor=t(cor(.[,3:11], .[,3])))) 

LƯU Ý:t phần được đóng góp bởi @ Alex

Hoặc

library(data.table) 
d1 <- copy(mtcars) 
setnames(setDT(d1)[, as.list(cor(.SD, .SD[[1]])) , cyl, 
          .SDcols=3:11], names(d1)[2:11])[] 
Các vấn đề liên quan