может быть таким:
Вместо проверки на равенство всех возможных значений, мы можем сделать это для вектора и повторить матрицу из него до 1000 раз по строкам и столбцам. Это даст тот же результат. Порядок столбцов и строк не поддерживается этим кодом. Но, используя имена строк и столбцов, мы можем убедиться, что ответ правильный или нет.
Я использовал t()
, потому что привязка столбцов происходит быстрее, чем привязка строк.
system.time({
v1 <- c("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P")
m1 <- sapply(v1, function(x) as.integer(v1 == x))
rownames(m1) <- colnames(m1)
m1 <- do.call('cbind', mget(rep('m1', 1000)))
m1 <- t(m1)
m1 <- do.call('cbind', mget(rep('m1', 1000)))
m1 <- t(m1)
})
# user system elapsed
# 9.32 0.50 9.84
dim(m1)
# [1] 16000 16000
Другой метод:
Этот (жестко запрограммированный) не будет выполнять никакого сравнения, но мы создаем значения на основе того, что может произойти, сравнивая вектор с его собственными значениями.
Его можно улучшить с помощью конструкции eval(parse(text=paste()))
.
system.time({
m4 <- matrix(data =
c(
c(rep(1, 1000), rep(0, 15000)),
c(rep(0, 1000), rep(1, 1000), rep(0, 14000)),
c(rep(0, 2000), rep(1, 1000), rep(0, 13000)),
c(rep(0, 3000), rep(1, 1000), rep(0, 12000)),
c(rep(0, 4000), rep(1, 1000), rep(0, 11000)),
c(rep(0, 5000), rep(1, 1000), rep(0, 10000)),
c(rep(0, 6000), rep(1, 1000), rep(0, 9000)),
c(rep(0, 7000), rep(1, 1000), rep(0, 8000)),
c(rep(0, 8000), rep(1, 1000), rep(0, 7000)),
c(rep(0, 9000), rep(1, 1000), rep(0, 6000)),
c(rep(0, 10000), rep(1, 1000), rep(0, 5000)),
c(rep(0, 11000), rep(1, 1000), rep(0, 4000)),
c(rep(0, 12000), rep(1, 1000), rep(0, 3000)),
c(rep(0, 13000), rep(1, 1000), rep(0, 2000)),
c(rep(0, 14000), rep(1, 1000), rep(0, 1000)),
c(rep(0, 15000), rep(1, 1000))), nrow = 16000, ncol = 16000)
})
# user system elapsed
# 0.72 0.93 1.82
Примечание: Как сказал @ r2evans, это не будет работать, если выборочные данные ОП не являются репрезентативными для реальных данных