5

我有一个矩阵(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
4

2 回答 2

7

有一个函数称为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'))
于 2019-10-29T12:59:37.680 回答
1

这会生成一个 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
于 2019-10-29T13:18:26.167 回答