通过查询其他两个相关数据框来创建数据框

问题描述 投票:0回答:1

我想创建一个数据框,用于计算其他两个相关数据框的特征丰度,但不知道什么代码会给我所需的输出。 第一个数据框,物种丰度,包含物种(行)和位点(列)。例如;

          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")
r dataframe matrix-multiplication
1个回答
0
投票

首先,我们将

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
© www.soinside.com 2019 - 2024. All rights reserved.