通过R中的行标签计算相对丰度? (素食包?)

时间:2016-05-06 21:21:24

标签: r dataframe vegan

我正在尝试根据行标签或名称计算相对丰度(在df$path1中获得每个测试的相对丰度。所以我想计算来自test1的相对丰度,并分别从test2计算相对丰度的计数。test1的相对丰度数之和等于1.

我目前正在使用vegan软件包,但可以使用其他选项。

测试数据集:

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的相对丰度的理想输出,如下所示:

x path1 relabun_bypath1
a test1 0.8
b test1 0.2
c test2 0.74
d test2 0.26
e test3 1

1 个答案:

答案 0 :(得分:1)

这是一个经典的拆分 - 应用 - 组合问题。基础R中最直观的方式是

  • 使用override func viewDidLoad(){ self.quoteTitle.text = self.quoteTitleString etc... }
  • 按组拆分data.frame
  • 使用split
  • 应用函数
  • *applydo.call(rbind, ... )结合使用。

所以

unlist

我们可以分配给一个新变量。但是,base有一个很好的奇怪命名函数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 ,它可以为我们跨群组应用函数:

ave

这更简洁,同样可以分配给新变量。

如果您更喜欢Hadleyverse,ave(df$value, df$path1, FUN = function(x){x / sum(x)}) # [1] 0.8000000 0.2000000 0.7391304 0.2608696 1.0000000 的分组可以使过程更具可读性:

dplyr

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

无论你选择哪种方式,都要对逻辑感到满意,因为你很可能会使用它。更好,学习所有这些。并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 tapply / mapplyMap ......为什么不呢?

注意:如果您愿意,也可以使用data.table功能替换value / sum(value))构造。它更简洁(例如prop.table),但不太明显它正在做什么,这就是为什么我没有在这里使用它。