【问题标题】:Count the number of non-zero elements of each column统计每一列的非零元素个数
【发布时间】:2023-01-18 19:24:03
【问题描述】:

R 非常新,我有一个 .rda 文件,其中包含基因 ID 矩阵和 96 列中每个 ID 的计数。它看起来像这样:

我想单独计算每列中非零项的数量。我一直在循环中尝试 sum() 函数,但也许我不理解 R 中的循环语法。感谢任何帮助。 谢谢!

森林

【问题讨论】:

    标签: r


    【解决方案1】:

    关于什么:

    apply(your.matrix, 2, function(c)sum(c!=0))
    

    这有帮助吗?

    编辑:

    更好的是:

    colSums(your.matrix != 0)
    

    编辑 2:

    我们开始吧,给你举个例子:

    > example = matrix(sample(c(0,0,0,100),size=70,replace=T),ncol=7)
    > example
          [,1] [,2] [,3] [,4] [,5] [,6] [,7]
     [1,]    0  100    0    0  100    0  100
     [2,]  100    0    0    0    0    0  100
     [3,]    0    0    0    0    0    0  100
     [4,]    0  100    0    0    0    0    0
     [5,]    0    0  100  100    0    0    0
     [6,]    0    0    0  100    0    0    0
     [7,]    0  100  100    0    0    0    0
     [8,]  100    0    0    0    0    0    0
     [9,]  100  100    0    0  100    0    0
    [10,]    0    0    0    0    0  100    0
    > colSums(example != 0)
    [1] 3 4 2 2 2 1 3
    

    (新示例,前面带有“1”值的示例不适合表明我们正在对数字细胞,而不是他们的内容)

    【讨论】:

    • 有点......这看起来像是给了我每列所有计数的总和。有没有办法修改它,以便我获得每列非零元素的数量?那么,如果每列有 1000 行并且给定列有 72 个非零行,那么该列的计数是 72?谢谢。
    • 我相信你错了:这段代码给了你确切地你想要什么......我正在添加一个例子来说服你:)
    • 这应该工作。 c!=0 是 TRUE 或 FALSE 的向量,它被 sum(...) 强制为 1 或 0。因此,只要 c!=0,您就将 1 加起来,这给出了非零元素的计数。
    • 我在包含所有数值的数据框中使用它,但它为每一列返回“NA”。我尝试了 df = colSums(df > 0) 的变体来达到同样的效果。你能建议一下吗?
    • @FingerPickingGood 您可能会遇到此错误,因为您在每一列中都有 NA 值。尝试添加参数na.rm=TRUE,例如:colSums(df != 0, na.rm=T)
    【解决方案2】:

    x 是列或向量;

    length(which(x != 0))

    【讨论】:

      【解决方案3】:

      另一种使用plyrnumcolwise的方法:

      library(plyr)
      
      dat <- data.frame(a = sample(1:25, 25),
                        b = rep(0, 25),
                        c = sample(1:25, 25))
      nonzero <- function(x) sum(x != 0)
      numcolwise(nonzero)(dat)
         a b  c
      1 25 0 25
      

      【讨论】:

        【解决方案4】:

        有一种方法可以计算具有零的列数。这个使用dplyr

        首先,data.frame 操作模式需要是 rowwise() 然后,列必须是 c_across() 的子集,它返回一个向量,可以在任何接受向量的函数中使用。最后,使用mutate() 将值分配给新列。

        library(dplyr)
        
        df <- data.frame(a = sample(0:10, 100, replace = T),
                         b = sample(0:10, 100, replace = T),
                         c = sample(0:10, 100, replace = T))
        
        df %>%
        rowwise() %>%
        mutate(`N_zeros` = sum(c_across(everything()) == 0))
        

        这个想法也可以修改为任何其他操作,这些操作将采用所有列或列的子集进行逐行操作。

        有关详细信息,请参阅 documentationc_across()。使用 dplyr 版本 1.0.6 进行测试。

        【讨论】:

          猜你喜欢
          • 2023-03-08
          • 2011-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-31
          • 1970-01-01
          相关资源
          最近更新 更多