R语言 将数据集的输出合并到新行中

vc6uscn9  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(130)

我正在审查Create a new column based on the the values and heading of another datasetR - Add a column on a dataset based on values from another dataset,但我想使用数据集的输出,而不是我试图重新合并到我的新数据集的一个数据集的输出。
要添加行的数据集% 1

Species      Association Day   month  year  season  cover     evi
<fctr>       <chr>      <dbl> <dbl>  <dbl> <chr>   <chr>     <chr>
21  BW       RC           22    1   2   dry       Evergreen edge
22  MANG     RC           22    1   2   dry       Evergreen edge
23  RC       RC           22    1   2   dry       Evergreen edge
24  RC        SKS         22    1   2   dry       Evergreen edge
25  RC        NA          22    1   2   dry       Mixed     edge
26  SKS      MANG         22    1   2   dry       Evergreen edge
27  RC        NA          30    1   2   dry       Mixed     edge
28  SKS       NA          30    1   2   dry       Mixed     edge
29  RC        NA          30    1   2   dry       Mixed     edge
30  RC       BABO         30    1   2   dry       Mixed     edge

我想使用计算SES_C.分数或两个物种的共存后的值,在此通过data2计算

group_id                      RC  BW   SKS BABO  MANG
<chr>                        <dbl><dbl><dbl><dbl><dbl>
2-1-15-Deciduous.dry_470        1   0   0   0   0
2-1-15-Evergreen.dry_1850       0   1   0   0   0
2-1-15-Evergreen.dry_2020       1   1   0   0   0
2-1-23-Semi-Deciduous.dry_1000  0   0   1   0   0
2-1-23-Semi-Deciduous.dry_1310  0   0   1   0   0
2-1-23-Open.dry_1745            1   0   0   0   0
2-1-25-Evergreen.dry_1805       1   1   0   0   0
2-1-25-Evergreen.dry_2050       1   0   0   0   0
2-1-29-Mixed.dry_750            1   0   0   1   0
2-1-29-Evergreen.dry_1958       1   0   0   0   1

data2 <- data2[,2:6]
nperm <- 1000
outpath <- getwd()
Cscore <- ecospat.Cscore(data2, nperm, outpath, verbose = T)

当运行Cscore时,您会得到一个带有SES_C.score的表输出。

Sp1    Sp2    obs.C.score   exp.C.score  SES_Cscore    pval_less   pval_greater
<chr>  <chr>   <int>        <int>        <dbl>         <dbl>     <dbl>
RC  BW      5   5   -0.8079579  0.4845155   0.9520480
RC  SKS    14   6   1.5873256   1.0000000   0.2317682
RC  BABO    0   7   -1.0829308  0.4605395   1.0000000
RC  MANG    0   0   -1.1117101  0.4475524   1.0000000
BW  SKS     6   6   0.5844538   1.0000000   0.7442557
BW  BABO    3   3   0.3143282   1.0000000   0.9100899
BW  MANG    3   3   0.3914705   1.0000000   0.8671329
SKS BABO    2   2   0.2699785   1.0000000   0.9320679
SKS MANG    2   2   0.2804816   1.0000000   0.9270729
BABO MANG   1   1   0.1903501   1.0000000   0.9650350

我想将物种对之间的值合并到data1中,因此输出为

Species      Association Day   month  year  season  cover     evi     Cscore
<fctr>       <chr>      <dbl> <dbl>  <dbl> <chr>   <chr>     <chr>     <dbl>
21  BW       RC           22    1   2   dry       Evergreen edge -0.8079579          
22  MANG     RC           22    1   2   dry       Evergreen edge -1.1117101
23  RC       BW           22    1   2   dry       Evergreen edge -0.8079579
24  RC        SKS         22    1   2   dry       Evergreen edge 1.5873256
25  RC        NA          22    1   2   dry       Mixed     edge   NA
26  SKS      MANGA        22    1   2   dry       Evergreen edge 0.2804816
27  RC        NA          30    1   2   dry       Mixed     edge    NA
28  SKS       NA          30    1   2   dry       Mixed     edge    NA
29  RC        NA          30    1   2   dry       Mixed     edge    NA
30  RC       BABO         30    1   2   dry       Mixed     edge -1.0829308

当我按照建议运行merge时,它在一定程度上可以工作,但不能像我需要的那样读取我的表。例如,RC作为物种和BABO作为关联的CscoreBABO在物种和RC在关联中相同。
数据:

data1 <-  data.frame(
  Species = factor(
    c("BW", "MANG", "RC", "RC", "RC", "SKS", "RC", "SKS", "RC", "RC"),
    levels = c("BABO", "BW", "MANG", "RC", "SKS")
  ),
  Association = c("RC", "RC", "BW", "SKS", NA, "MANG", NA, NA, NA, "BABO"),
  Day = c(22, 22, 22, 22, 22, 22, 30, 30, 30, 30),
  month = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
  year = c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2),
  season = c(
    "dry", "dry", "dry", "dry", "dry", "dry", "dry", "dry", "dry",
    "dry"
  ),
  cover = c(
    "Evergreen", "Evergreen", "Evergreen", "Evergreen", "Mixed",
    "Evergreen", "Mixed", "Mixed", "Mixed", "Mixed"
  ),
  evi = c(
    "edge", "edge", "edge", "edge", "edge", "edge", "edge", "edge",
    "edge", "edge"
  ),
  row.names = 21:30
)

data2 <- tibble::tribble(
  ~group_id,                        ~RC, ~BW, ~SKS, ~BABO, ~MANG,
  "2-1-15-Deciduous.dry_470",       1,   0,   0,    0,     0,
  "2-1-15-Evergreen.dry_1850",      0,   1,   0,    0,     0,
  "2-1-15-Evergreen.dry_2020",      1,   1,   0,    0,     0,
  "2-1-23-Semi-Deciduous.dry_1000", 0,   0,   1,    0,     0,
  "2-1-23-Semi-Deciduous.dry_1310", 0,   0,   1,    0,     0,
  "2-1-23-Open.dry_1745",           1,   0,   0,    0,     0,
  "2-1-25-Evergreen.dry_1805",      1,   1,   0,    0,     0,
  "2-1-25-Evergreen.dry_2050",      1,   0,   0,    0,     0,
  "2-1-29-Mixed.dry_750",           1,   0,   0,    1,     0,
  "2-1-29-Evergreen.dry_1958",      1,   0,   0,    0,     1,
)
rjee0c15

rjee0c151#

您可以使用read.table读取文本文件中的分数(这假设您的工作目录与outpath参数使用的目录相同)。

library(ecospat)

ecospat.Cscore(data2, nperm, outpath, verbose = T)

my_scores <- read.table("Cscores.txt", header = TRUE)

my_scores data.frame应该如下所示,包含物种对的C-score索引值:

Sp1  Sp2 obs.C.score exp.C.score SES_Cscore pval_less pval_greater
1    RC   BW           5          12 -0.8021481 0.4775225    0.9470529
2    RC  SKS          14           0  1.5714268 1.0000000    0.2347652
3    RC BABO           0           7 -1.0340807 0.4835165    1.0000000
4    RC MANG           0           0 -1.0571308 0.4725275    1.0000000
5    BW  SKS           6           6  0.5403029 1.0000000    0.7712288
6    BW BABO           3           3  0.3620642 1.0000000    0.8841159
7    BW MANG           3           3  0.3162434 1.0000000    0.9090909
8   SKS BABO           2           2  0.2784037 1.0000000    0.9280719
9   SKS MANG           2           2  0.2678424 1.0000000    0.9330669
10 BABO MANG           1           1  0.1696401 1.0000000    0.9720280

然后,您可以使用merge返回到数据集,指示merge针对两个data. frame中的每一个的列。all.x将保留第一个data.frame data1的所有列。

merge(data1, my_scores, by.x = c("Species", "Association"), by.y = c("Sp1", "Sp2"), all.x = TRUE)

最终结果如下。只有3对完全匹配(RC/BABO、RC/BW和RC/SKS)。

Species Association Day month year season     cover  evi obs.C.score exp.C.score SES_Cscore pval_less pval_greater
1       BW          RC  22     1    2    dry Evergreen edge          NA          NA         NA        NA           NA
2     MANG          RC  22     1    2    dry Evergreen edge          NA          NA         NA        NA           NA
3       RC        BABO  30     1    2    dry     Mixed edge           0           7 -1.0340807 0.4835165    1.0000000
4       RC          BW  22     1    2    dry Evergreen edge           5          12 -0.8021481 0.4775225    0.9470529
5       RC         SKS  22     1    2    dry Evergreen edge          14           0  1.5714268 1.0000000    0.2347652
6       RC        <NA>  30     1    2    dry     Mixed edge          NA          NA         NA        NA           NA
7       RC        <NA>  22     1    2    dry     Mixed edge          NA          NA         NA        NA           NA
8       RC        <NA>  30     1    2    dry     Mixed edge          NA          NA         NA        NA           NA
9      SKS       MANGA  22     1    2    dry Evergreen edge          NA          NA         NA        NA           NA
10     SKS        <NA>  30     1    2    dry     Mixed edge          NA          NA         NA        NA           NA

编辑:若要按物种“pair”(RC/BABO或BABO/RC)合并,可以新建一列定义该对(按字母顺序排列),然后在新的“pair”列上合并。

请注意,Species已从因子转换为字符,以便在创建新字符species_pair列时使用。

data1$Species <- as.character(data1$Species)
data1$species_pair <- with(data1, paste0(pmin(Species, Association, na.rm = T), pmax(Species, Association, na.rm = T)))
my_scores$species_pair <- with(my_scores, paste0(pmin(Sp1, Sp2), pmax(Sp1, Sp2)))

merge(data1, my_scores, by = "species_pair")

输出

species_pair Species Association Day month year season     cover  evi Sp1  Sp2 obs.C.score exp.C.score SES_Cscore pval_less pval_greater
1       BABORC      RC        BABO  30     1    2    dry     Mixed edge  RC BABO           0           0 -1.0528984 0.4745255    1.0000000
2         BWRC      RC          BW  22     1    2    dry Evergreen edge  RC   BW           5          12 -0.7665897 0.4875125    0.9380619
3         BWRC      BW          RC  22     1    2    dry Evergreen edge  RC   BW           5          12 -0.7665897 0.4875125    0.9380619
4       MANGRC    MANG          RC  22     1    2    dry Evergreen edge  RC MANG           0           7 -1.0382307 0.4815185    1.0000000
5      MANGSKS     SKS        MANG  22     1    2    dry Evergreen edge SKS MANG           2           0  0.2721024 1.0000000    0.9310689
6        RCSKS      RC         SKS  22     1    2    dry Evergreen edge  RC  SKS          14          14  1.5631332 1.0000000    0.2387612

相关问题