R函数类似于Excel的索引匹配

时间:2014-05-22 15:30:38

标签: r match lookup

我确信我的问题有一个相当直接的解决方案。然而,我有限的R技能让我失望,但我还没有找到合适的解决方案。

我有一个矩阵A看起来像:

     Year SIC       alpha  
[1,] 1990  13 -0.08610973 
[2,] 1990  15 -0.02270707  
[3,] 1990  20  0.01273243
[4,] 1990  25 -0.25173402 
[5,] 1991  26 -0.02625965 
[6,] 1991  27 -0.02685330 
....

和矩阵B看起来像

      46   27   13   37   20   ...
1989  NA   NA   NA   NA   NA
1990  NA   NA   NA   NA   NA
1991  NA   NA   NA   NA   NA

我想进行一种二维查找。我想粘贴矩阵A'" alpha"中的值。到矩阵B,其中B的行名称匹配A$Year,B的列名称匹配A$SIC。所以基本上类似于Excel的索引匹配函数。

结果如下:

      46   27             13           37   20   ...
1989  NA   NA             NA           NA   NA
1990  NA   NA            -0.08610973   NA   0.01273243
1991  NA   -0.02685330    NA           NA   NA

我希望有人能帮助我。

提前多多感谢!

1 个答案:

答案 0 :(得分:2)

#reproduce data
A <- read.table(text="Year SIC       alpha  
1990  13 -0.08610973 
1990  15 -0.02270707  
1990  20  0.01273243
1990  25 -0.25173402 
1991  26 -0.02625965 
1991  27 -0.02685330", header=TRUE)

B <- read.table(text="      46   27   13   37   20  
1989  NA   NA   NA   NA   NA
1990  NA   NA   NA   NA   NA
1991  NA   NA   NA   NA   NA", header=TRUE, check.names=FALSE)

A <- as.matrix(A)
B <- as.matrix(B)

#reshape to long format
Bm <- stack(as.data.frame(B))
Bm$ind <- as.character(Bm$ind)
Bm$year <- rownames(B)

#merge
C <- merge(Bm[, c("ind", "year")], 
           as.data.frame(A), 
           by.x=c("ind", "year"), 
           by.y=c("SIC", "Year"), 
           all.x=TRUE)

#reshape to wide format
library(reshape2)
dcast(C, year~ind)

#  year          13         20         27 37 46
#1 1989          NA         NA         NA NA NA
#2 1990 -0.08610973 0.01273243         NA NA NA
#3 1991          NA         NA -0.0268533 NA NA