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