【问题标题】:Counting the number of specific integers per column in an R matrix计算 R 矩阵中每列特定整数的数量
【发布时间】:2020-02-24 17:16:56
【问题描述】:

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

【问题讨论】:

    标签: r matrix count apply


    【解决方案1】:

    有一个名为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 在 cmets 中提到的那样,如果您在任何列中有缺失值,那么您希望能够强制转换为数据框(或矩阵)。为了克服这个问题,我们可以使用levels = c(0:2) 将每一列转换为因子,即

    apply(a, 2, function(i) table(factor(i, levels = c(0:2)), useNA = 'always'))
    

    【讨论】:

    • 我的实际矩阵很大(100 x 3,000,000),它在某些行中包含 NA。 Table 有一个名为 useNA 的功能,但我无法正确使用它,您有什么建议吗? as
    • 如果某些列不包含所有三个整数,尝试使用 as.data.frame(apply(a, 2, table)) 将其设为 data.frame 将导致 Error ... arguments imply differing number of rows: 3, 2(或 3、1,具体取决于存在的整数数量)
    • 这个例子就是这样一个例子。有些列没有全部三个整数,因此该表只有该列的两个元素,as.data.frame 会产生错误。如果您使用的是as.data.table,则会收到警告,它会回收短输出。
    • @IceCreamToucan 已编辑。现在就试一试
    • 是的,按预期工作。我猜我在这个例子中遇到了R version set.seed difference。我猜是时候终于升级这台机器了。
    【解决方案2】:

    这会生成一个 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 2016-11-09
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多