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
очень эффективен для векторизованных операций над матрицами.