Управлять матрицей на основе двух пороговых векторов в R - PullRequest
3 голосов
/ 19 марта 2019

Я не знаю точно, как мне сформулировать эту проблему, и я не могу придумать ни одного примера, как ее решить.Я придумала решение, но мне интересно, есть ли более простой или более эффективный способ борьбы с ним.

Я работаю с матрицей расстояний между людьми и событиями и хочу преобразоватьматрица, основанная на характеристиках событий и отдельных лиц.В этом случае я хочу знать, подвергался ли человек какому-либо событию в пределах определенного расстояния на основе других критериев.

Допустим, у нас есть два вектора, один из 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

это имеет смысл?Нет ли более простого способа сделать это?Было бы проще иметь только один вектор, но это невозможно выяснить в случае пороговых значений для строк и столбцов.

1 Ответ

2 голосов
/ 19 марта 2019

Мы можем сделать это в одной строке (или разделить на 2 строки для наглядности), используя col/row для репликации 'event_year' и 'indiv_born', изменив логический вектор на NA, когда 'event_year'меньше, чем «Individual_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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...