r - 基于R中的两个阈值向量操作矩阵
问题描述
我不知道我应该如何构建这个问题,也想不出任何如何解决它的例子。我想出了一个解决方案,但我想知道是否有更简单或更有效的方法来处理它。
我正在处理个人和事件之间的距离矩阵,我想根据事件和个人的特征转换矩阵。在这种情况下,我想知道一个人是否根据其他标准在一定距离内接触过事件。
假设我们有两个向量,一个是 4 个个体,另一个是 3 个事件。我们获得了一个以公里为单位的个人和事件之间的距离矩阵:
> 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
这有意义吗?没有更简单的方法可以做到这一点吗?只有一个向量会更简单,但在特定于行和列的阈值的情况下无法弄清楚。
解决方案
我们可以在一行中执行此操作(或分成两行以提高可见性),使用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)
推荐阅读
- reactjs - Reactjs:如何在我的网页中打印选择项?
- javascript - 从 Javascript 调用 Python 函数
- airflow - 我可以在 Airflow 中拥有不同开始日期的一个 DAG 下的任务吗?
- javascript - 用于页面转换的 Barba.js 错误:“推送状态尝试失败”
- spring - Spring - 如何更改属性
- python - 如何将特定链接存储为列表然后单击它们
- java - RecyclerView 适配器在奇怪的位置插入行
- android - 从不同的类更新视图模型
- scala - 试图理解 Scala 中的 ClassTag 和 TypeTag
- swift - 在用户输入的另一个键中创建一个包含键和值的字典