我想创建一个数据框,从另外两个相关的数据框计算性状的丰度,但不知道什么代码会给予我想要的输出。第一个数据框,物种丰度,包含物种(行)的网站(列)。例如;
BaCo_1 BaFa_1 BaSl_1 BrSl_1 CaCo_1 CaFa_1 CaSl_1
Abla.nota 0 0 3 2 9 0 0
Albo.woro 0 0 0 1 0 0 2
Aust.coll 0 2 0 0 2 0 0
Bibu.Kadj 0 0 1 0 0 0 0
cala.sp 0 0 0 0 0 7 1
第二个框架,物种特征,包含物种(行)的特征(列);
MFA2 MFA4 MFA5 MFA6 MFA12 MFA14 flow1 flow2 flow3
Abla.nota 1 0 0 0 0 0 1 0 0
Albo.woro 0 0 0 1 0 0 1 0 0
alel.aust 0 1 0 0 0 0 0 0 1
Aulo.stri 1 0 0 0 0 0 0 0 1
Aust.anac 0 0 0 0 1 0 1 0 0
Aust.coll 0 0 0 0 1 0 1 0 0
Aust.subt 0 1 0 0 0 0 0 0 1
bero.sp 0 1 0 0 0 0 1 0 0
Bibu.Kadj 1 0 0 0 0 0 0 0 1
Bran.sowe 0 0 1 0 0 0 1 0 0
cala.sp 0 0 0 1 0 0 1 0 0
请注意,“traits”数据框包含的物种比“sites”数据框多。这是因为性状数据框包含研究中的所有物种,其中“位点”数据框是子集。上面的两个示例都是完整数据的子集。
从这些,我想创建第三个数据框架,网站(行)的特点(列),一个数据框架,其中有在每个网站的特点丰度,无论物种拥有这些特点;
MFA2 MFA4 MFA5 MFA6 MFA12 MFA14 flow1 flow2 flow3
BaCo_1 0 0 0 0 0 0 0 0 0
BaFa_1 0 0 0 0 2 0 2 0 0
BaSl_1 4 0 0 0 0 0 3 0 1
BrSl_1 2 0 0 1 0 0 3 0 0
CaCo_1 9 0 0 0 2 0 11 0 0
CaFa_1 0 0 0 7 0 0 7 0 0
CaSl_1 0 0 0 3 0 0 3 0 0
我手工创建了这个输出,因为我不知道什么代码会产生这个输出。每个值是样本(行)中具有性状(列)的所有个体的丰度的总和。例如,上述示例输出11中的CaCo_1 x flow 1是来自第一 Dataframe 的9 alba.nota
和2 Aust.coll
的总和,第一 Dataframe 具有第二 Dataframe 中标识的flow1
特性。
我应该使用什么代码和包来产生这个结果?
sites_df <- structure(list(BaCo_1 = c(0, 0, 0, 0, 0), BaFa_1 = c(0, 0, 2,
0, 0), BaSl_1 = c(3, 0, 0, 1, 0), BrSl_1 = c(2, 1, 0, 0, 0),
CaCo_1 = c(9, 0, 2, 0, 0), CaFa_1 = c(0, 0, 0, 0, 7), CaSl_1 = c(0,
2, 0, 0, 1)), row.names = c("Abla.nota", "Albo.woro", "Aust.coll",
"Bibu.Kadj", "cala.sp"), class = "data.frame")
traits_df <- structure(list(MFA2 = c(1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0), MFA4 = c(0,
0, 1, 0, 0, 0, 1, 1, 0, 0, 0), MFA5 = c(0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0), MFA6 = c(0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1), MFA12 = c(0,
0, 0, 0, 1, 1, 0, 0, 0, 0, 0), MFA14 = c(0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0), flow1 = c(1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1), flow2 = c(0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0), flow3 = c(0, 0, 1, 1, 0, 0, 1,
0, 1, 0, 0)), row.names = c("Abla.nota", "Albo.woro", "alel.aust",
"Aulo.stri", "Aust.anac", "Aust.coll", "Aust.subt", "bero.sp",
"Bibu.Kadj", "Bran.sowe", "cala.sp"), class = "data.frame")
2条答案
按热度按时间2izufjch1#
你可以把这两个三角形相乘。
注意,输出是一个矩阵。如果需要,可以使用
as.data.frame()
将其转换回 Dataframe 。wvyml7n52#
首先,我们将
data.frames
转换为tibble
s,并将行名称转换为列。其次,我们left_join()
两个数据集,pivot_longer()
trait列。我们现在可以将站点列与trait值相乘,最后将summarise()
数据乘以site
名称sum()
。