【问题标题】:Creating a table of species traits weighted by abundance in R在 R 中创建按丰度加权的物种特征表
【发布时间】:2015-07-14 23:31:02
【问题描述】:

我有一个物种特征表(>400 个物种,50 个特征中的每一个都有分数)。我希望通过在多个站点 (150 个站点) 记录的物种丰度来衡量这一点,最终创建一个每个站点中每个单独性状的总得分表。我可以手动执行此操作(见下文),但不确定如何更有效地编写代码。

T1 <- c(0,1,0); T2 <- c(0,0,0.5); T3 <- c(1,0,0.5);
T4 <- c(1,0,0.5); T5 <- c(0,1,0.5);
df.trt <- data.frame(T1,T2,T3,T4,T5)
rownames(df.trt) <- c("Species.A", "Species.B", "Species.C")
rm(T1,T2,T3,T4,T5)

Site.1 <- c(10,0,1); Site.2 <- c(0,3,7); Site.3 <- c(2,4,100)
df.abund <- data.frame(Site.1,Site.2,Site.3)
rownames(df.abund) <- c("Species.A", "Species.B", "Species.C")
rm(Site.1,Site.2,Site.3)
### Table of Species Traits
df.trt

### Table of Species Abundance
df.abund

###Generating the weighted table manually
Site.1 <- c(sum(df.trt[,1]*df.abund[,1]),
            sum(df.trt[,2]*df.abund[,1]), sum(df.trt[,3]*df.abund[,1]),
            sum(df.trt[,4]*df.abund[,1]), sum(df.trt[,5]*df.abund[,1]))
Site.2 <- c(sum(df.trt[,1]*df.abund[,2]),
            sum(df.trt[,2]*df.abund[,2]), sum(df.trt[,3]*df.abund[,2]),
            sum(df.trt[,4]*df.abund[,2]), sum(df.trt[,5]*df.abund[,2]))
Site.3 <- c(sum(df.trt[,1]*df.abund[,3]),
            sum(df.trt[,2]*df.abund[,3]), sum(df.trt[,3]*df.abund[,3]),
            sum(df.trt[,4]*df.abund[,3]), sum(df.trt[,5]*df.abund[,3]))
wt.trt <- data.frame(Site.1, Site.2, Site.3)
rm(Site.1,Site.2,Site.3)
rownames(wt.trt) <- c("T1","T2","T3","T4","T5")
wt.trt <- t(wt.trt); wt.trt <- data.frame(wt.trt)

###To generate the following table
wt.trt

我知道这不应该是一项过于繁重的任务,但我不知道如何去做。感谢您提供的任何建议。

PS:我对 R 还很陌生,这是我在 Stack Overflow 上的第一篇文章,如果我不小心不遵守网站规则/礼仪,我深表歉意。我不认为这是一个重复的查询(或者至少,我找不到任何有帮助的东西)

【问题讨论】:

    标签: r


    【解决方案1】:

    上面的代码可以变成一个循环。以下是隐藏/避免循环的方法:

    do.call(rbind,
      lapply(df.abund, function(x) colSums(x*df.trt))
    )
    #        T1   T2   T3   T4   T5
    # Site.1  0  0.5 10.5 10.5  0.5
    # Site.2  3  3.5  3.5  3.5  6.5
    # Site.3  4 50.0 52.0 52.0 54.0
    

    这会计算每一行,然后将它们绑定在一起。 (尝试只运行第二行来查看。)

    sapply(df.abund, function(x) colSums(x*df.trt))
    #    Site.1 Site.2 Site.3
    # T1    0.0    3.0      4
    # T2    0.5    3.5     50
    # T3   10.5    3.5     52
    # T4   10.5    3.5     52
    # T5    0.5    6.5     54
    

    这一次计算了整个事情,但不幸的是翻转了行和列。

    【讨论】:

    • 是的,这非常有效。非常感谢您的帮助!
    【解决方案2】:

    以下可用于执行权重计算:

    wt.trt <- data.frame(colSums(df.trt*df.abund[,1]),colSums(df.trt*df.abund[,2]),colSums(df.trt*df.abund[,3]))
    rownames(wt.trt) <- c("T1","T2","T3","T4","T5")
    wt.trt <- t(wt.trt); wt.trt <- data.frame(wt.trt)    
    ###To generate the following table
    View(wt.trt)
    

    【讨论】:

    • 感谢您的回复。我想我需要创建一个 for 循环来遍历所有 50 个特征?
    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 2021-11-25
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多