假设我有以下列表:
$`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。
那么矩阵应在相应字段中显示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