2012-02-03 24 views
10

Tôi có 2 khung dữ liệu w/5 cột và 100 hàng mỗi khung.R tương quan giữa 2 dataframes theo hàng

id  price1  price2  price3  price4  price5 
1   11.22  25.33  66.47  53.76  77.42 
2   33.56  33.77  44.77  34.55  57.42 
... 

Tôi muốn có được mối tương quan của các hàng tương ứng, về cơ bản

for(i in 1:100){  
cor(df1[i, 1:5], df2[i, 1:5])  
} 

nhưng mà không sử dụng một vòng lặp for. Tôi giả sử có một số cách để sử dụng plyr để làm điều đó nhưng dường như không thể làm đúng. Bất kỳ đề xuất?

Trả lời

20

Tùy thuộc vào việc bạn muốn có một giải pháp mát hoặc nhanh bạn có thể sử dụng một trong hai

diag(cor(t(df1), t(df2))) 

đó là mát mẻ nhưng lãng phí (vì nó thực sự tính toán tương quan giữa tất cả các hàng mà bạn không thực sự cần để họ sẽ bị loại bỏ) hoặc

A <- as.matrix(df1) 
B <- as.matrix(df2) 
sapply(seq.int(dim(A)[1]), function(i) cor(A[i,], B[i,])) 

chỉ thực hiện những gì bạn muốn nhưng hơi hơn một chút để nhập.

+1

+1 Đó là một đầu tiên là mát mẻ. Ngoài ra, 't (as.matrix (df1))' có thể trở thành 't (df1)', vv, do sự ép buộc ma trận diễn ra hoàn toàn khi 't()' được truyền vào một data.frame. –

+0

Ah, tuyệt vời, cảm ơn (đây là nơi suy nghĩ cấp thấp của tôi được tôi;)), tôi sẽ chỉnh sửa rằng –

+0

Điều đó đã làm điều đó. Cảm ơn nhiều. – screechOwl

4

Tôi thấy rằng không cần phải có as.matrix.

Tương quan của tất cả các cặp của hàng giữa dataframes df1df2:

sapply(1:nrow(df1), function(i) cor(df1[i,], df2[i,])) 

và cột:

sapply(1:ncol(df1), function(i) cor(df1[,i], df2[,i])) 
Các vấn đề liên quan