R语言 通过查询其他两个相关数据框创建数据框

vlju58qv  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(149)

我想创建一个数据框,从另外两个相关的数据框计算性状的丰度,但不知道什么代码会给予我想要的输出。第一个数据框,物种丰度,包含物种(行)的网站(列)。例如;

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")
2izufjch

2izufjch1#

你可以把这两个三角形相乘。

t(sites_df) %*% as.matrix(traits_df[rownames(sites_df), ])

#        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

注意,输出是一个矩阵。如果需要,可以使用as.data.frame()将其转换回 Dataframe 。

wvyml7n5

wvyml7n52#

首先,我们将data.frames转换为tibble s,并将行名称转换为列。其次,我们left_join()两个数据集,pivot_longer() trait列。我们现在可以将站点列与trait值相乘,最后将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

相关问题