基于R中的两个阈值向量来操纵矩阵

时间:2019-03-19 18:17:17

标签: r matrix

我不知道该如何解决这个问题,也无法想到解决该问题的任何示例。我想出了一个解决方案,但我想知道是否有一种更简单或更有效的处理方法。

我正在处理个人和事件之间的距离矩阵,我想根据事件和个人的特征来变换矩阵。在这种情况下,我想知道某个人是否根据其他条件在一定距离内接触到事件。

假设我们有两个向量,一个是4个人,另一个是3事件。我们获得了个人与事件之间以km为单位的距离的矩阵:

> dist_mat = matrix(runif(12, 1, 100), ncol = 3)
> dist_mat
         [,1]      [,2]      [,3]
[1,] 21.318423 89.79522 75.29824
[2,] 36.812542 18.28413 92.90719
[3,] 45.012960 89.11778 38.55608
[4,]  8.470336 46.17020 26.67135

最重要的是,我知道个人何时出生以及何时发生事件,这些事件存储在两个向量中:

> event_year = c(2003, 2005, 2009)
> indiv_born = c(2004, 2004, 2008, 2008)

我的目标是知道某人是否在出生后和30公里之内发生过某件事。在这一点上,我的解决方案是将年向量扩展为矩阵,然后从那里计算出来,然后使用rowSums来获取是否有人暴露于此类事件的指标:

> event_year_m = matrix(rep(event_year, each = nrow(x1)), ncol = ncol(x1))
> indiv_born_m = matrix(rep(indiv_year, each = ncol(x1)), byrow = TRUE, ncol = ncol(x1))
> event_year_m
     [,1] [,2] [,3]
[1,] 2003 2005 2009
[2,] 2003 2005 2009
[3,] 2003 2005 2009
[4,] 2003 2005 2009
> indiv_year_m
     [,1] [,2] [,3]
[1,] 2004 2004 2004
[2,] 2004 2004 2004
[3,] 2008 2008 2008
[4,] 2008 2008 2008

> dist_mat[event_year_m < indiv_year_m] = NA
> dist_mat[dist_mat < 30] = 1
> dist_mat[dist_mat >= 30] = 0
> dist_mat
     [,1] [,2] [,3]
[1,]   NA    0    0
[2,]   NA    1    0
[3,]   NA   NA    0
[4,]   NA   NA    1

> indiv_exposure = rowSums(dist_mat, na.rm = TRUE)
[1] 0 1 0 1

这有意义吗?有没有更简单的方法来做到这一点?仅具有一个向量会更简单,但是在行和列特定的阈值的情况下无法解决。

1 个答案:

答案 0 :(得分:2)

我们可以使用col/row复制“ event_year”和“ indiv_born”,在一行中(或为了可见性而分为两行)来完成此操作,并在以下情况下将逻辑向量更改为NA 'event_year'小于'indiv_born',乘以dist_mat,使NA保持NA,用< 30转换成逻辑矩阵并得到rowSums

rowSums((dist_mat * NA^(event_year[col(dist_mat)] < 
             indiv_born[row(dist_mat)])) < 30, na.rm = TRUE)