创建一个矩阵列表,用于测量R中增长率的差异

创建一个矩阵列表,用于测量R中增长率的差异,r,list,matrix,R,List,Matrix,假设我有以下列表: $`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,19

假设我有以下列表:

$`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))

欢迎任何帮助

使用
外部

> 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

像往常一样完美,谢谢@Bouvel上校!最后一个问题:如果组合中存在NA值,如何确保粘贴0?我觉得理解不正确,您是指a.split中某个data.frame的增长列中的NA?在本例中,您可以这样做
lst=lapply(a.split,function(u){u[is.na(u)]=0;u})
,然后应用外部的单行脚本。
> 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