как перебрать каждый элемент в матрице в г - PullRequest
0 голосов
/ 28 июня 2018

Контекст: я перебираю несколько переменных в моем наборе данных и выполняю парное t.test между факторами для каждой из этих переменных. (что мне удалось выполнить). и пример результата, который я имею, выглядит так:

Таблица значений P между классами 11,12,13 и 14

Моя следующая задача, с которой у меня возникли трудности, - представить каждое из этих значений в виде таблицы, где для каждого элемента, если его значение ниже определенного порогового значения (скажем, 0,05), тогда таблица должна динамически отображаться, если тест между в двух проходах классов (представленных 1, если ниже 0,05, и 0, если выше 0,05) в таблице также должно отображаться соотношение количества пройденных испытаний в виде доли от числа проведенных испытаний. (количество записей в таблице ниже 0,05 от общего количества записей в диагональной матрице ). В отношении изображения выше, результат должен выглядеть следующим образом: Идеальная матрица

Итак, проблема в том, что по сути я должен пройти через первую матрицу (исключая первую строку и первый столбец), применить функцию, а затем сгенерировать новую строку и заголовок со сводкой строк и столбцов! Буду признателен за любую помощь или совет.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вот один из способов сделать то, что вы хотите.

Сначала я составлю матрицу.

set.seed(3781)
pval <- matrix(runif(9, 0, 0.07), 3)
is.na(pval) <- upper.tri(pval)
dimnames(pval) <- list(12:14, 11:13)

Теперь вопрос.

Ideal <- matrix(as.integer(pval < 0.05), nrow(pval))
dimnames(Ideal) <- dimnames(pval)
Ideal
#   11 12 13
#12  1 NA NA
#13  1  1 NA
#14  1  0  0


r <- sum(Ideal, na.rm = TRUE)/sum(!is.na(Ideal))
r
#[1] 0.6666667

Так что теперь все, что нужно, это добавить дополнительную строку и столбец.

Ideal <- rbind(Ideal, colSums(!is.na(Ideal)))
Ideal <- cbind(Ideal, rowSums(Ideal, na.rm = TRUE))
Ideal[nrow(pval) + 1, ncol(pval) + 1] <- r
rownames(Ideal)[nrow(pval) + 1] <- "SumCount"
colnames(Ideal)[nrow(pval) + 1] <- "SumScore"
0 голосов
/ 28 июня 2018

R не очень полезный инструмент для создания такой таблицы, но вот одно из решений.

Данные (для удобства сокращены десятичные дроби):

mat <- matrix(c(.569, .0001, .1211, NA, .0001, .3262, NA, NA, .0001), nrow = 3)

       [,1]   [,2]  [,3]
[1,] 0.5690     NA    NA
[2,] 0.0001 0.0001    NA
[3,] 0.1211 0.3262 1e-04

Сначала мы конвертируем в схему 0,1, используя ifelse с условием < .05:

mat <- ifelse(mat < .05, 1, 0)

Затем мы добавляем еще один столбец с rowSums:

mat <- cbind(mat, rowSums(mat, na.rm = T))

Затем мы добавляем еще одну строку с colSums логической матрицы !is.na(mat), таким образом, считая числа не NA на столбец:

mat <- rbind(mat, colSums(!is.na(mat)))

Затем мы меняем нижнюю правую ячейку на sum внутренней матрицы, деленную на количество не NA внутренней матрицы:

mat[nrow(mat), ncol(mat)] <- sum(mat[1:nrow(mat)-1, 1:ncol(mat)-1], na.rm = T)/
                             sum(!is.na(mat[1:nrow(mat)-1, 1:ncol(mat)-1]))

Наконец, мы меняем имена строк и столбцов:

rownames(mat) <- c(12:14, "SumCount")
colnames(mat) <- c(11:13, "SumScore")

Конечный результат:

> mat
         11 12 13 SumScore
12        0 NA NA      0.0
13        1  1 NA      2.0
14        0  0  1      1.0
SumCount  3  2  1      0.5

Обратите внимание, что цикл не был необходим, так как R очень эффективен для векторизованных операций над матрицами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...