使用 dplyr 标准化和过滤长矩阵

Posted

技术标签:

【中文标题】使用 dplyr 标准化和过滤长矩阵【英文标题】:normalize and filtering long matrix with dplyr 【发布时间】:2017-07-22 00:47:44 【问题描述】:

我很享受学习 dplyr 的乐趣,但除了基本的东西之外,我还是不能做更多的事情。

基本上,我想规范化数据(将条目除以行的总和)

messy <- data.frame(o1 = c(1,2,1,2),
                    o2 = c(2,3,0,1),
                    o3 = c(3,2,0,1),
                    o4 = c(1,1,4,4))
normalized.messy = messy/apply(messy,1,sum)

然后我想这样识别列

apply(normalized.messy,2,sum)/sum(apply(normalized.messy,2,sum))

我做了类似以下的事情

messy <- data.frame(samples = c("s1", "s2", "s3", "s4"),
                o1 = c(1,2,1,2),
                o2 = c(2,3,0,1),
                o3 = c(3,2,0,1),
                o4 = c(1,1,4,4))

bb = gather(messy, otu, counts, o1:o4)
group_by(bb, otu) %>% mutate(nr = scale(count))
bb.nr = group_by(bb, otu) %>% mutate(nr = scale(count))

但得到以下错误,

Error: cannot coerce type 'closure' to vector of type 'any'

我很欣赏校正缩放部分以及过滤

【问题讨论】:

【参考方案1】:

为了解决您遇到的错误,我怀疑这是因为您将列数命名为(带 s)而不是仅仅计数。

就您的 dplyr 代码而言,我认为您的第一组是向后的。这是我对你想要什么的理解。首先您要按样本分组以获得每个样本的 OTU 比例,然后您希望按 OTU 分组以获得样本之间的平均 OTU 比例:

messy <- data.frame(samples = c("s1", "s2", "s3", "s4"),
            o1 = c(1,2,1,2),
            o2 = c(2,3,0,1),
            o3 = c(3,2,0,1),
            o4 = c(1,1,4,4))
bb <- gather(messy, otu, counts, o1:o4)

bb %>% group_by(samples) %>% mutate(prop = counts/sum(counts)) %>%
       group_by(otu) %>% summarize(mean(prop))

【讨论】:

以上是关于使用 dplyr 标准化和过滤长矩阵的主要内容,如果未能解决你的问题,请参考以下文章

pandas:是不是可以使用任意长的布尔标准过滤数据帧?

使用过滤器/变异和 dplyr/tidyverse 逻辑对数据库进行分类[重复]

R使用dplyr包对变量特征进行标准化(standardize)缩放操作

R中的标准评估和非标准评估

使用标准评估更改 dplyr::count 中的变量名称

使用 count()、aggregate()、data.table() 或 dplyr() 汇总数据(均值、标准差)