2015-03-03 28 views
5

Giả sử tôi có một danh sách các ma trận:Giữ 2 giá trị cao nhất của mỗi hàng trong một danh sách các ma trận r

$`2010` 
    1 2 3 4 
1 0 3 5 6 
2 5 1 9 5 
3 0 0 0 0 
4 10 10 10 0 

$`2011` 
    1 2 3 4 
1 0 2 3 6 
2 5 0 3 1 
3 2 4 0 1 
4 2 1 2 1 

Mã để tạo ra các ma trận:

cntry<-c(1,2,3,4) 
a<-c(0,5,0,10) 
b<-c(3,1,0,10) 
c<-c(5,9,0,10) 
d<-c(6,5,0,0) 
k<-data.frame(a,b,c,d) 
k<-as.matrix(k) 
dimnames(k)<-list(cntry,cntry) 

e<-c(0,5,2,2) 
f<-c(2,0,4,1) 
g<-c(3,3,0,2) 
h<-c(6,1,1,1) 
l<-data.frame(e,f,g,h) 
l<-as.matrix(l) 
dimnames(l)<-list(cntry,cntry) 

list<-list(k,l) 
names(list)<-2010:2011 

Tôi muốn giữ hai giá trị cao nhất trong mỗi hàng và thay thế các giá trị nhỏ hơn còn lại của các ô khác trong cùng hàng bằng 0.

Nếu có nhiều hơn hai ô có giá trị cao nhất, tôi muốn để tất cả các ô đó như cũ (ví dụ: 10 10 10 0-> 10 10 10 0, 5 1 9 5 -> 5 0 9 5). Tất cả các ô khác của hàng phải được đặt thành 0 lần nữa.

Kết quả sẽ giống như thế này:

$`2010` 
    1 2 3 4 
1 0 0 5 6 
2 5 0 9 5 
3 0 0 0 0 
4 10 10 10 0 

$`2011` 
    1 2 3 4 
1 0 0 3 6 
2 5 0 3 0 
3 2 4 0 0 
4 2 0 2 0 

Tôi không chắc chắn làm thế nào để tiếp cận vấn đề này, vì vậy bất kỳ sự giúp đỡ là rất hoan nghênh!

Trả lời

4

Dưới đây là một cách tiếp cận:

lapply(list, function(x) { 
    t(apply(x, 1, function(y) { 
    y[!y %in% tail(sort(y), 2)] <- 0 
    y 
    })) 
}) 

## $`2010` 
## 1 2 3 4 
## 1 0 0 5 6 
## 2 5 0 9 5 
## 3 0 0 0 0 
## 4 10 10 10 0 
## 
## $`2011` 
## 1 2 3 4 
## 1 0 0 3 6 
## 2 5 0 3 0 
## 3 2 4 0 0 
## 4 2 0 2 0 

này hoạt động bằng cách lặp lại trên các yếu tố của danh sách (với lapply), điều trị mỗi lần lượt là đối tượng x, và sau đó iterating trên các hàng của x đó (với apply(x, 1, ...)) gọi hàng y và áp dụng một chức năng cho nó.

Chức năng áp dụng cho hàng y danh sách các yếu tố x là:

function(y) { 
    y[y < tail(sort(y), 2)] <- 0 
    y 
} 

trong đó xác định hai yếu tố cao nhất giá trị của hàng (tail(sort(y), 2)), trả về một vector logic chỉ mà các yếu tố của y không nằm trong tập hợp đó (với y < ...), đặt các phần tử của vector y bằng vectơ logic đó và gán 0 cho các phần tử này. Cuối cùng, nó trả về biến đổi y.

+2

Có thể sử dụng 'y <' vì nó sẽ nhanh hơn '% trong%'? Ngoài ra, có khả năng làm việc tốt hơn với số điểm nổi. +1. – BrodieG

+0

@BrodieG Điểm tốt! Cảm ơn bạn. – jbaums

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