我想创建一个数据框,用于计算其他两个相关数据框的特征丰度,但不知道什么代码会给我所需的输出。 第一个数据框,物种丰度,包含物种(行)和位点(列)。例如;
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 flow1 是第一个数据帧中具有第二个数据帧中标识的 flow1 特征的 9 个 alba.nota 和 2 个 Aust.coll 的总和。
我应该使用什么代码和包来产生这个结果?
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")
首先,我们将
data.frames
转换为 tibble
并将行名称转换为
列。
其次,我们left_join()
两个数据集和pivot_longer()
特征列。
我们现在可以将站点列与特征值相乘,最后summarise()
数据由 site
名称与 sum()
组成。
library(tidyverse)
traits_df2 <-
traits_df |>
as_tibble(rownames = "row_names")
sites_df2 <-
sites_df |>
as_tibble(rownames = "row_names")
left_join(sites_df2, traits_df2) |>
pivot_longer(-c(row_names, (MFA2:flow3)), names_to = "site") |>
mutate(across(MFA2:flow3, \(x) x * value)) |>
group_by(site) |>
summarise(across(MFA2:flow3, sum))
#> Joining with `by = join_by(row_names)`
#> # A tibble: 7 × 10
#> site MFA2 MFA4 MFA5 MFA6 MFA12 MFA14 flow1 flow2 flow3
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 BaCo_1 0 0 0 0 0 0 0 0 0
#> 2 BaFa_1 0 0 0 0 2 0 2 0 0
#> 3 BaSl_1 4 0 0 0 0 0 3 0 1
#> 4 BrSl_1 2 0 0 1 0 0 3 0 0
#> 5 CaCo_1 9 0 0 0 2 0 11 0 0
#> 6 CaFa_1 0 0 0 7 0 0 7 0 0
#> 7 CaSl_1 0 0 0 3 0 0 3 0 0