假设我有以下列表:

$`1990`
  cntry year growth
1     1 1990      1
2     2 1990      2
3     3 1990     14

$`1991`
  cntry year growth
4     1 1991      6
5     2 1991      5
6     3 1991      7

创建列表的代码:
cntry<-c(1,2,3,1,2,3)
year<-c(1990,1990,1990,1991,1991,1991)
growth<-c(1,2,14,6,5,7)

a<-data.frame(cntry,year,growth)
a.split<-split(a, as.factor(a$year))

我要创建的是一个矩阵列表,用于衡量两个国家之间的增长率差异。
  • 在相应的矩阵中,仅当列中国家的增长率为时,才应计算增长率的差异
    高于行中该国家之一。
  • 如果列中的增长率等于或小于以下之一
    行中的国家/地区,则矩阵应显示值为0。
  • 如果组合中至少有一个国家/地区具有NA值,
    那么矩阵应在相应字段中显示0。

  • 结果应如下所示:
    $`1990`
      1 2  3
    1 0 1 13
    2 0 0 12
    3 0 0  0
    
    $`1991`
      1 2 3
    1 0 0 1
    2 1 0 2
    3 0 0 0
    

    任何帮助都非常欢迎!

    最佳答案

    使用outer:

    > lapply(a.split, function(x) t(outer(x$growth, x$growth, function(u,v) ifelse(u>v, u-v, 0))))
    #$`1990`
    #     [,1] [,2] [,3]
    #[1,]    0    1   13
    #[2,]    0    0   12
    #[3,]    0    0    0
    
    #$`1991`
    #     [,1] [,2] [,3]
    #[1,]    0    0    1
    #[2,]    1    0    2
    #[3,]    0    0    0
    

    07-27 21:06