Подсчет количества определенных целых чисел на столбец в матрице R - PullRequest
5 голосов
/ 29 октября 2019

У меня есть матрица (10 x 100), где мне нужно посчитать количество каждого целого числа в столбце, поэтому у меня есть окончательная матрица (3 x 100). Подсчитывает 0, 1 и 2 на столбец.

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

Любая помощь будет принята с благодарностью.

library(dplyr)
set.seed(100)
a <- matrix(sample(0:2, size=100, replace=TRUE), nrow=10, ncol=100)
out <- apply(a, 2, function(x) count(x))

 Desired output: rows are the sum of each variable "0, 1, 2"

   1 2 3 ...  n
 0 1 1 3
 1 6 3 3
 2 3 6 4

Ответы [ 2 ]

7 голосов
/ 29 октября 2019

Существует функция с именем table, которая подсчитывает различные значения всего объекта. Вы можете применить его к каждому столбцу, то есть

apply(a, 2, table)

, чтобы включить NA в счетчик. Просто используйте параметр useNA, то есть

apply(a, 2, table, useNA = 'always')

#or with complete syntax
apply(a, 2, function(i)table(i, useNA = 'always'))

, как @IceCreamToucan упоминает в комментариях, еслиу вас есть пропущенные значения в любом столбце, и вы хотите иметь возможность привести к фрейму данных (или матрицу в этом отношении). Чтобы преодолеть это, мы можем преобразовать каждый столбец в коэффициент с levels = c(0:2), т.е.

apply(a, 2, function(i) table(factor(i, levels = c(0:2)), useNA = 'always'))
1 голос
/ 29 октября 2019

Это создает data.frame и гарантирует, что для каждого входного столбца выходной столбец содержит все три целых числа (даже если входной столбец не содержит). Примечание: colSums также имеет аргумент na.rm.

data.frame(
  int_counted = 0:2, 
  do.call(rbind, lapply(0:2, function(x) colSums(a == x)))
)

Выход

#   int_counted X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22
# 1           0  4  2  2  2  3  8  1  2  3   3   4   2   2   2   3   8   1   2   3   3   4   2
# 2           1  5  4  4  3  2  2  6  4  3   4   5   4   4   3   2   2   6   4   3   4   5   4
# 3           2  1  4  4  5  5  0  3  4  4   3   1   4   4   5   5   0   3   4   4   3   1   4
#   X23 X24 X25 X26 X27 X28 X29 X30 X31 X32 X33 X34 X35 X36 X37 X38 X39 X40 X41 X42 X43 X44 X45
# 1   2   2   3   8   1   2   3   3   4   2   2   2   3   8   1   2   3   3   4   2   2   2   3
# 2   4   3   2   2   6   4   3   4   5   4   4   3   2   2   6   4   3   4   5   4   4   3   2
# 3   4   5   5   0   3   4   4   3   1   4   4   5   5   0   3   4   4   3   1   4   4   5   5
#   X46 X47 X48 X49 X50 X51 X52 X53 X54 X55 X56 X57 X58 X59 X60 X61 X62 X63 X64 X65 X66 X67 X68
# 1   8   1   2   3   3   4   2   2   2   3   8   1   2   3   3   4   2   2   2   3   8   1   2
# 2   2   6   4   3   4   5   4   4   3   2   2   6   4   3   4   5   4   4   3   2   2   6   4
# 3   0   3   4   4   3   1   4   4   5   5   0   3   4   4   3   1   4   4   5   5   0   3   4
#   X69 X70 X71 X72 X73 X74 X75 X76 X77 X78 X79 X80 X81 X82 X83 X84 X85 X86 X87 X88 X89 X90 X91
# 1   3   3   4   2   2   2   3   8   1   2   3   3   4   2   2   2   3   8   1   2   3   3   4
# 2   3   4   5   4   4   3   2   2   6   4   3   4   5   4   4   3   2   2   6   4   3   4   5
# 3   4   3   1   4   4   5   5   0   3   4   4   3   1   4   4   5   5   0   3   4   4   3   1
#   X92 X93 X94 X95 X96 X97 X98 X99 X100
# 1   2   2   2   3   8   1   2   3    3
# 2   4   4   3   2   2   6   4   3    4
# 3   4   4   5   5   0   3   4   4    3
...