【问题标题】:Create a list of matrices that measure differences in growth rates in R创建一个矩阵列表来衡量 R 中的增长率差异
【发布时间】:2015-02-06 14:00:36
【问题描述】:

假设我有以下列表:

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

我想要创建一个矩阵列表,用于衡量两国之间的增长率差异。

  1. 在各自的矩阵中,仅当列中国家的增长率时才应计算增长率的差异 高于该行中的国家/地区。
  2. 如果列中的增长率等于或小于 行中的国家/地区,则矩阵应显示值 0。
  3. 如果组合中至少有一个国家/地区具有 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

非常欢迎任何帮助!

【问题讨论】:

    标签: r list matrix


    【解决方案1】:

    使用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
    

    【讨论】:

    • 一如既往地完美运行,感谢@colonel beauvel!最后一个问题:如果组合中有 NA 值,您如何确保粘贴 0 代替?
    • 我感觉理解不正确,你的意思是a.split中你的data.frame的增长列中有一个NA?在这种情况下,您可以这样做lst=lapply(a.split, function(u) {u[is.na(u)]=0;u}),然后应用外部的一行脚本。
    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2020-11-24
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多