2010-04-11 48 views
5

Tôi đã có khung dữ liệu trong R và tôi muốn thực hiện phép tính trên tất cả các cặp hàng. Có cách nào đơn giản hơn để thực hiện việc này hơn là sử dụng vòng lặp lồng nhau không?Hoạt động trên các hàng của một khung dữ liệu

Để làm cho bê tông này, hãy xem xét một khung dữ liệu với mười hàng, và tôi muốn tính toán sự khác biệt về điểm số giữa tất cả (45) cặp có thể.

> data.frame(ID=1:10,Score=4*10:1) 
    ID Score 
1 1 40 
2 2 36 
3 3 32 
4 4 28 
5 5 24 
6 6 20 
7 7 16 
8 8 12 
9 9  8 
10 10  4 

Tôi biết tôi có thể thực hiện phép tính này với vòng lặp lồng nhau, nhưng có cách nào tốt hơn (nhiều R-ish) hơn để làm điều đó không?

Trả lời

4

đây một giải pháp khác sử dụng combn:

df <- data.frame(ID=1:10,Score=4*10:1) 
cm <- combn(df$ID,2) 
delta <- df$Score[cm[1,]]-df$Score[cm[2,]] 

hoặc trực tiếp hơn

df <- data.frame(ID=1:10,Score=4*10:1) 
delta <- combn(df$ID,2,function(x) df$Score[x[1]]-df$Score[x[2]]) 
+0

Ooh, tôi thích chức năng combn rất nhiều. –

+0

+1 Tôi nghĩ rằng đây có thể là một chức năng bị bỏ qua nhiều. – Iterator

+0

Tôi đang cố gắng sao chép điều này trên một khung dữ liệu với một số cột, nhưng không thể làm cho nó hoạt động. @teucer có thể hiển thị cách thực hiện điều này? Ví dụ. nếu có score1, score2, score3 vv Chỉ cần được rõ ràng, sự khác biệt giữa [1,2] và [2,2], không phải tổng [1,] và tổng [2,]. Vì vậy, bạn sẽ kết thúc với một khung dữ liệu có cùng số cột như cột ban đầu, nhưng có nhiều hàng hơn. –

7

Để tính toán sự khác biệt, có lẽ bạn có thể sử dụng

outer(df$Score,df$Score,"-") 
3
colmx = matrix(rep(df[,2], 10), ncol=10, byrow=F) 
rowmx = matrix(rep(df[,2], 10), ncol=10, byrow=T) 
delta = colmx - rowmx 
+0

~ ubuntu và tôi nhận được câu trả lời tương tự; 'bên ngoài' là một trình bao bọc trên ma trận tính toán tôi đã làm rõ ràng, điều này giải thích sự khác biệt hiệu suất giữa hai - đối với ma trận 100 x 100, trung bình trên 100 thử nghiệm, tích hợp chỉ chậm hơn khoảng 10% - cho tất cả các đồ tạo tác trong việc đo lường thứ này, tôi sẽ nói nó nằm trong ngưỡng tiếng ồn. – doug

3

dist() là bạn bạn bè.

dist(df$Score) 

Bạn có thể đặt nó như là một ma trận:

as.matrix(dist(df$Score)) 
+0

làm thế nào tôi đã bỏ lỡ (một) được xây dựng trong ?! Dù sao, tốt đẹp nhất, 1 từ tôi. – doug

Các vấn đề liên quan