在R

时间:2015-07-14 12:17:30

标签: r

我有一个物种特征表(> 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上的第一篇文章,如果我不小心不遵守网站规则/礼仪,那么道歉。我不认为这是一个重复的查询(或者至少,我找不到任何有帮助的内容)

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

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

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)