簡體   English   中英

基於R中的兩個閾值向量來操縱矩陣

[英]Manipulate matrix based on two threshold vectors in R

我不知道我應該如何構建這個問題,也不能想到如何解決它的任何例子。 我提出了一個解決方案,但我想知道是否有更簡單或更有效的方法來處理它。

我正在處理個人和事件之間的距離矩陣,我想根據事件和個體的特征來轉換矩陣。 在這種情況下,我想知道一個人是否根據其他標准接觸了一定距離內的事件。

假設我們有兩個向量,一個是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

這有意義嗎? 有沒有更簡單的方法來做到這一點? 只有一個向量會更簡單,但在行和列特定閾值的情況下無法弄清楚。

我們可以在一行(或分為2行以查看可見性)中使用col/row復制'event_year'和'indiv_born',當'event_year'小於'indiv_born'時將邏輯向量更改為NA ',與dist_mat相乘以使NA保持NA,轉換為< 30的邏輯矩陣並獲取rowSums

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM