Создать строки и столбцы для матрицы - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть матрица.Ряды являются владельцами (a, b, c ...);столбцы компании (с1, с2, ...).Ниже приведены примерные данные:

m1 <- matrix(0.1, nrow = 3, ncol = 3, dimnames = list(c('a','b','c'), c('c1','c2','c3')))

m1 показывает владельцев a, b, c, каждой собственной компании c1, c2, c3 10%.Я хочу создать несколько гипотетических владельцев, чтобы каждый гипотетический владелец владел оставшимися 70% одной компании, но не владел другими компаниями.Желаемый результат как ниже.В желаемом результате d, e, f являются гипотетическими владельцами, каждый из которых владеет компанией по 70%.

    c1  c2  c3
a   0.1 0.1 0.1
b   0.1 0.1 0.1
c   0.1 0.1 0.1
d   0.7 NA  NA
e   NA  0.7 NA
f   NA  NA  0.7

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

d <- c(0.7, NA, NA)
m2 <- rbind(m1, d)

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Мы можем сделать набор matrix с NA элементами и заполнить диагональ в процентах.Как отметил @Jilber Urbina, мы можем объявить row.names в пределах matrix:

hypo_companies <- c("d", "e", "f")
percentage <- 0.7

hypo_len <- length(hypo_companies)
hypo_mat <- matrix(NA, hypo_len, hypo_len, dimnames = list(hypo_companies))
diag(hypo_mat) <- rep(percentage, hypo_len)
rbind(m1, hypo_mat)

Выход:

   c1  c2  c3
a 0.1 0.1 0.1
b 0.1 0.1 0.1
c 0.1 0.1 0.1
d 0.7  NA  NA
e  NA 0.7  NA
f  NA  NA 0.7
0 голосов
/ 21 февраля 2019

Это должно сделать работу.

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

m1 <- matrix(0.1, nrow = 3, ncol = 3, dimnames = list(c('a','b','c'), c('c1','c2','c3')))

m2 <- diag(1 - colSums(m1))

m2
#>      [,1] [,2] [,3]
#> [1,]  0.7  0.0  0.0
#> [2,]  0.0  0.7  0.0
#> [3,]  0.0  0.0  0.7

Затем нам нужно добавить имена строк к m2.Возможно, мы захотим выделить первые 3 буквы алфавита , а не , используемые для m1.Преимущество этого состоит в том, что вам не нужно указывать имена строк новой матрицы - они будут распределяться на основе того, что еще не было использовано.

rownames(m2) <- letters[!letters %in% rownames(m1)][1:nrow(m2)]

rbind(m1, m2)
#>    c1  c2  c3
#> a 0.1 0.1 0.1
#> b 0.1 0.1 0.1
#> c 0.1 0.1 0.1
#> d 0.7 0.0 0.0
#> e 0.0 0.7 0.0
#> f 0.0 0.0 0.7

Как видите, этот кодпо-прежнему работает с большим количеством строк / столбцов и разными числами в m1:

m1 <- matrix(0.11, nrow = 3, ncol = 4, dimnames = list(c('a','b','c'), c('c1','c2','c3','c4')))

m1
#>     c1   c2   c3   c4
#> a 0.11 0.11 0.11 0.11
#> b 0.11 0.11 0.11 0.11
#> c 0.11 0.11 0.11 0.11

m2 <- diag(1 - colSums(m1))

m2
#>      [,1] [,2] [,3] [,4]
#> [1,] 0.67 0.00 0.00 0.00
#> [2,] 0.00 0.67 0.00 0.00
#> [3,] 0.00 0.00 0.67 0.00
#> [4,] 0.00 0.00 0.00 0.67

rownames(m2) <- letters[!letters %in% rownames(m1)][1:nrow(m2)]

rbind(m1, m2)
#>     c1   c2   c3   c4
#> a 0.11 0.11 0.11 0.11
#> b 0.11 0.11 0.11 0.11
#> c 0.11 0.11 0.11 0.11
#> d 0.67 0.00 0.00 0.00
#> e 0.00 0.67 0.00 0.00
#> f 0.00 0.00 0.67 0.00
#> g 0.00 0.00 0.00 0.67

Создано в 2019-02-20 пакетом представлением (v0.2.1)

0 голосов
/ 21 февраля 2019
m2 = rbind(m1, do.call(rbind, lapply(1:NCOL(m1), function(i) replace(rep(NA, NCOL(m1)), i, 0.7))))
row.names(m2) = c(row.names(m1), c("d", "e", "f"))
m2
#   c1  c2  c3
#a 0.1 0.1 0.1
#b 0.1 0.1 0.1
#c 0.1 0.1 0.1
#d 0.7  NA  NA
#e  NA 0.7  NA
#f  NA  NA 0.7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...