首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中按行标号计算相对丰度?(素食套餐?)

R中按行标号计算相对丰度?(素食套餐?)
EN

Stack Overflow用户
提问于 2016-05-06 21:21:23
回答 1查看 10.6K关注 0票数 1

我试图根据行标签或名称来计算相对丰度(获取df$path1中每个测试的相对丰度)。因此,我想从test1中计算计数的相对丰度,并分别从test2计算计数的相对丰度。test1的相对丰度数之和等于1。

我目前正在使用vegan包,但对其他选项开放。

测试数据集:

代码语言:javascript
复制
library(vegan)
df <- data.frame(x = c("a", "b", "c", "d", "e"), 
                 path1 = c("test1", "test1", "test2", "test2", "test3"),
                 value = c(40, 10, 34, 12, 20))
df$relabun <- decostand(df[3], 2, method = "total") #takes relative abundace of whole column

基于df$path1的相对丰富的理想输出应该如下所示:

代码语言:javascript
复制
x path1 relabun_bypath1
a test1 0.8
b test1 0.2
c test2 0.74
d test2 0.26
e test3 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-06 21:46:16

这是一个典型的分裂-应用-组合问题。基R中最直接的方式是

  • 将data.frame按组与split拆分,
  • 使用*apply应用函数,以及
  • do.call(rbind, ... )unlist相结合。

所以

代码语言:javascript
复制
unlist(lapply(split(df, df$path1), function(x){x$value / sum(x$value)}))
#    test11    test12    test21    test22     test3 
# 0.8000000 0.2000000 0.7391304 0.2608696 1.0000000 

我们可以给一个新变量赋值。但是,base有一个名为ave的好函数,尽管名称奇怪,它可以为我们跨组应用函数:

代码语言:javascript
复制
ave(df$value, df$path1, FUN = function(x){x / sum(x)})
# [1] 0.8000000 0.2000000 0.7391304 0.2608696 1.0000000

这是一个很好的更简洁,并同样可以被分配到一个新的变量。

如果您喜欢哈德利弗斯,dplyr的分组可以使这个过程更具可读性:

代码语言:javascript
复制
library(dplyr)
df %>% group_by(path1) %>% mutate(relAbundByPath = value / sum(value))
# Source: local data frame [5 x 4]
# Groups: path1 [3]
# 
#        x  path1 value relAbundByPath
#   (fctr) (fctr) (dbl)          (dbl)
# 1      a  test1    40      0.8000000
# 2      b  test1    10      0.2000000
# 3      c  test2    34      0.7391304
# 4      d  test2    12      0.2608696
# 5      e  test3    20      1.0000000

如您所见,它返回一个新版本的data.frame,我们可以使用它来覆盖现有的版本或创建一个新的副本。

无论您选择哪一条路线,都要对逻辑感到满意,因为您可能会经常使用它。更好的是,把它们都学好。tapplymapply/Mapdata.table...why不是吗?

注意:--如果您愿意,也可以用prop.table函数替换value / sum(value))构造。它更简洁(例如ave(df$value, df$path1, FUN = prop.table)),但不太清楚它在做什么,这就是为什么我没有在这里使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37081612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档