Соответствующие имена строк, равные именам столбцов (симметричной или асимметричной матрицы) - PullRequest
1 голос
/ 26 апреля 2019

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

Пример меньшей матрицы показан ниже:

       1         2         3         4
1 0.4966143 0.8359290 0.7319204 0.7579902
3 0.7002979 0.8621343 0.5152356 0.7875813
4 0.7406555 0.8371479 0.7103873 0.5530200

Я хочу, чтобы это закончилосьвверх как это

       1         2         3         4
1    TRUE      FALSE     FALSE     FALSE
3   FALSE      FALSE     TRUE      FALSE
4   FALSE      FALSE     FALSE      TRUE

Был бы рад, если бы я мог сделать это без каких-либо циклов, просто векторизованный код

1 Ответ

3 голосов
/ 26 апреля 2019

Мы можем использовать outer

out <- outer(row.names(m1), colnames(m1), `==`)
dimnames(out) <- dimnames(m1)
out
#     1     2     3     4
#1  TRUE FALSE FALSE FALSE
#3 FALSE FALSE  TRUE FALSE
#4 FALSE FALSE FALSE  TRUE

или rep разрешить имена строк и столбцов, чтобы сделать равными length s, а затем выполнить ==

`dim<-`(row.names(m1)[row(m1)] == colnames(m1)[col(m1)], dim(m1))

ПРИМЕЧАНИЕ: как предложено @NelsonGon, когда мы читаем данные (read.table/read.csv и т. Д.) Как data.frame, к именам столбцов может добавляться префикс X, так как это неканонические имена, то есть начинающиеся с цифры. Чтобы избежать этого, используйте аргумент check.names = FALSE в read.table/read.csv или пост-процесс, изменив имена столбцов

outer(row.names(df), sub("^X","",names(df)),"==")

при условии, что 'df' является объектом идентификатора data.frame

данные

m1 <- structure(list(`1` = c(0.4966143, 0.7002979, 0.7406555), 
                     `2` = c(0.835929,  0.8621343, 0.8371479), 
                     `3` = c(0.7319204, 0.5152356, 0.7103873), 
                     `4` = c(0.7579902, 0.7875813, 0.55302)), 
                class = "data.frame", 
                row.names = c("1", "3", "4"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...