【发布时间】:2023-01-18 19:24:03
【问题描述】:
R 非常新,我有一个 .rda 文件,其中包含基因 ID 矩阵和 96 列中每个 ID 的计数。它看起来像这样:
我想单独计算每列中非零项的数量。我一直在循环中尝试 sum() 函数,但也许我不理解 R 中的循环语法。感谢任何帮助。 谢谢!
森林
【问题讨论】:
标签: r
R 非常新,我有一个 .rda 文件,其中包含基因 ID 矩阵和 96 列中每个 ID 的计数。它看起来像这样:
我想单独计算每列中非零项的数量。我一直在循环中尝试 sum() 函数,但也许我不理解 R 中的循环语法。感谢任何帮助。 谢谢!
森林
【问题讨论】:
标签: r
关于什么:
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”值的示例不适合表明我们正在对数字细胞,而不是他们的内容)
【讨论】:
c!=0 是 TRUE 或 FALSE 的向量,它被 sum(...) 强制为 1 或 0。因此,只要 c!=0,您就将 1 加起来,这给出了非零元素的计数。
na.rm=TRUE,例如:colSums(df != 0, na.rm=T)
x 是列或向量;
length(which(x != 0))
【讨论】:
另一种使用plyr的numcolwise的方法:
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
【讨论】:
有一种方法可以计算具有零的列数。这个使用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))
这个想法也可以修改为任何其他操作,这些操作将采用所有列或列的子集进行逐行操作。
有关详细信息,请参阅 documentation 或 c_across()。使用 dplyr 版本 1.0.6 进行测试。
【讨论】: