2013-08-01 83 views
0

我想創建一個排序查找,以獲得一個數據結構(理想的動物園),使用一個動物園(下面myZoo2)的值作爲列名查找另一個值(myZoo)。一個簡單的例子:在另一個動物園中使用動物園的值作爲列查找

require('zoo') 
require('tseries') 

dates = c('1/1/2000','1/2/2000','1/3/2000') 
z1 = zoo(c(1,2,3),dates) 
z2 = zoo(c(4,5,6),dates) 
z3 = zoo(c(7,8,9),dates) 
myZoo = merge(z1,z2,z3) 
colnames(myZoo) = c('a', 'b', 'c') 

z4 = zoo(c('c', 'b', 'a'), dates) 
z5 = zoo(c('b','a','b'), dates) 
z6 = zoo(c('c', 'c', 'a'), dates) 
myZoo2 = merge(z4,z5,z6) 

myZoo 
     a b c 
1/1/2000 1 4 7 
1/2/2000 2 5 8 
1/3/2000 3 6 9 

myZoo2 
     z4 z5 z6 
1/1/2000 c b c 
1/2/2000 b a c 
1/3/2000 a b a 

我在尋找的輸出:

1/1/2000 7 4 7 
1/2/2000 5 2 8 
1/3/2000 3 6 3 

我一直在試圖形式的多種不同的表情:

myZoo[,colnames=z2] 

以及匿名函數/ apply等。在此先感謝...

回答

2

您需要先獲取數據點的「座標」你想要。

match(index(myZoo2), index(myZoo))將匹配2個動物園對象的索引,match(as.vector(myZoo2), names(myZoo))將得到列號的列表。

然後你子集myZoocoord以獲得您想要的值。您仍然需要手動將數據「按摩」回到動物園對象。

coord <- cbind(match(index(myZoo2), index(myZoo)), match(as.vector(myZoo2), names(myZoo))) 

coord 
##  [,1] [,2] 
## [1,] 1 3 
## [2,] 2 2 
## [3,] 3 1 
## [4,] 1 2 
## [5,] 2 1 
## [6,] 3 2 
## [7,] 1 3 
## [8,] 2 3 
## [9,] 3 1 


zoo(matrix(as.matrix(myZoo)[coord], nrow = nrow(myZoo)), order.by = index(myZoo)) 
##    
## 1/1/2000 7 4 7 
## 1/2/2000 5 2 8 
## 1/3/2000 3 6 3 
+0

這不正是我要求的,謝謝。 – StatsViaCsh