Сравните несколько столбцов одной матрицы со столбцом другой матрицы в R - PullRequest
0 голосов
/ 31 октября 2018

Здесь я создал дубликат набора данных.

set.seed(1234)
m1 = matrix(runif(2000), nrow = 10, ncol = 200)
dim(m1)
[1]  10 200
m2 = matrix(runif(100), nrow = 10, ncol = 10)
dim(m2)
[1] 10 10

Я хочу сравнить первые 1:20 столбцы m1 с 1st column из m2 матрицы. Аналогично, для следующих 21:40 столбцов m1 против матрицы 2nd column из m2 и так далее. Наконец, 181:200 столбцы матрицы m1 против столбца 10th матрицы m2.

Я написал следующий код для сравнения 1st 20 столбцов матрицы m1 с столбцом 1st матрицы m2.

cc = matrix(NA, nrow(m2), ncol(m2))
for (j in 1:ncol(m2)) {
  for (i in 1:nrow(m2)) {
    cc[i, j] = ifelse(m1[i, j] < m2[i,1], 1, 0)
  }
}
ccvalue = data.frame(cc)

Как я могу улучшить вышеприведенное r code сделать приведенное выше сравнение. Есть ли какая-нибудь функция r, чтобы сделать?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Несколько вещей, на которые стоит обратить внимание:

(1) Хорошей практикой было бы также установить начальное значение для матрицы m2. Возможно, вы упустили это из виду.

(2) В предоставленном коде вы, похоже, сравниваете m2 с первыми 10 столбцами m1.

Если вы хотите сравнить только 10 столбцов, вы можете сделать это следующим образом:

cc <- (m2 > m1[, c(1:10)])*1
0 голосов
/ 31 октября 2018

Вы можете воспользоваться неявной векторизацией в R для запуска всей матрицы m1 относительно столбцов m2. Вам просто нужно получить м2, чтобы повторять столбцы путем поднабора одного и того же столбца снова и снова. Например, v <-c("A","B","C") вы можете сделать v[c(1,1,2,2,3,3)], что равно "A","A","B","B","C","C".

Проверьте следующий код и дайте мне знать, если у вас есть какие-либо вопросы:

# we want to compare m1[,c(1,2,3,...)], with m2[,c(1,1,1,...)]
# summing 1,0,...,1,0,... to get 1,1,...,2,2,...
m2_to_compare <- cumsum(rep(c(1,rep(0,19)),10)) 
# length should match m1 columns
length(m2_to_compare) 
(m1 < m2[,m2_to_compare]) * 1 # turns TRUEs and FALSEs into 1s and 0s

Ответ на комментарий:

cc = ifelse(m1 < m2[,m2_to_compare], 1, 0)
# depending on your seed:
sapply(1:10, function(colm) rowSums(cc[,m2_to_compare == colm]))
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    3    1   19    8    9   11   17    2   12    16
# [2,]    2   19   14   10   10   11    9    1    0    14
# [3,]   16   16   17    7    5   20    1   16    2    17
# [4,]   13    2    0   11   20   11    6    5   12     2
# [5,]    0   10    2    1   10   17    3   14    5     7
# [6,]   11    7   17    9   20   18   18   16    7     4
# [7,]   15    3    5    5    8    5    3    3    9     1
# [8,]    0   18    5    8    9   15    9   17    0    20
# [9,]   15   14    5    1    5    0    6   17   19     6
#[10,]    6    1    4   10   11   12    0    9    7     5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...