【问题标题】:Count where multiple columns match a single column in a presence absence matrix计算存在缺席矩阵中多列与单列匹配的位置
【发布时间】:2018-09-26 10:05:56
【问题描述】:

我有一个植物物种的存在缺失矩阵,它看起来像这样......

set.seed(123)
Data <- data.frame(
 endemic = sample(0:1, 10, replace = TRUE),
 val1p1 = sample(0:1, 10, replace = TRUE),
 val1p2 = sample(0:1, 10, replace = TRUE),
 val1p3 = sample(0:1, 10, replace = TRUE),
 val2p1 = sample(0:1, 10, replace = TRUE),
 val2p2 = sample(0:1, 10, replace = TRUE),
 val2p3 = sample(0:1, 10, replace = TRUE))
Data


   endemic invasive val1p1 val1p2 val1p3 val2p1 val2p2 val2p3
1        1        0      0      1      1      0      0      1
2        1        1      0      0      1      1      0      1
3        1        0      1      0      0      0      1      0
4        0        0      0      1      0      0      1      0
5        0        1      1      0      1      1      1      0
6        1        1      0      0      0      1      0      1
7        1        1      0      0      0      1      1      1
8        1        1      1      1      0      1      0      0
9        0        1      1      1      0      0      1      1
10       0        0      1      0      1      0      1      1

矩阵显示一个物种 (1-10) 是地方性的还是入侵性的,以及该物种在地块中是否存在 (1) 或不存在 (0)。这些地块位于不同的山谷(val1,val2)

我想知道在山谷 1 (val1) 中发现了多少特有物种。因此,我需要知道在多个列(val1p1、val1p2、val1p3)中发现的物种总数,然后知道其中有多少是地方性的(即有多少与“地方性”列匹配)。

在本例中,山谷 1 的物种总数为 8 个,其中 4 个为特有种。我想要的输出只是山谷 1 的特有物种的数量!

我的真实数据集实际上相当大,我在 8 个不同山谷的 75 个地块中有 200 个物种,因此我需要快速(ish)方法来做到这一点!

显然,我无法对各行求和,因为同一物种出现在不同的地块中。我尝试先使用 mutate 将地块组合成单独的山谷...

Data %>% mutate(val1 = coalesce(va1p1,val1p2,val1p3)

但是,这并不能正常工作,因为并非所有的 0 都被替换为 1。

有什么建议吗?我对 R 还是很陌生。

【问题讨论】:

  • 请使用种子更新您的示例数据:set.seed(123);Data &lt;- data.frame( ...,以便我们可以复制。如果您提供预期的输出,也很有帮助。

标签: r dplyr


【解决方案1】:

首先...仔细检查 !duplicate-part !!!

set.seed(123)
df <- data.frame( species = c(1:10),
  endemic = sample(0:1, 10, replace = TRUE),
  invasive = sample(0:1, 10, replace = TRUE),
  val1p1 = sample(0:1, 10, replace = TRUE),
  val1p2 = sample(0:1, 10, replace = TRUE),
  val1p3 = sample(0:1, 10, replace = TRUE),
  val2p1 = sample(0:1, 10, replace = TRUE),
  val2p2 = sample(0:1, 10, replace = TRUE),
  val2p3 = sample(0:1, 10, replace = TRUE))

df

library( tidyverse )

df %>% 
  gather( location, present, matches("^val") ) %>%
  mutate( valley = stringr::str_extract_all( .$location, "\\d", simplify = TRUE )[,1], 
          p      = stringr::str_extract_all( .$location, "\\d", simplify = TRUE )[,2] ) %>%
  filter( valley == 1, present == 1 ) %>%
  #filter out duuplicate species (from the top...) double-check if this is waht you want
  filter( !duplicated( species ) ) 

#   species endemic invasive location present valley p
# 1       1       0        0   val1p1       1      1 1
# 2       4       1        1   val1p1       1      1 1
# 3       6       0        0   val1p1       1      1 1
# 4       7       1        1   val1p1       1      1 1
# 5       8       1        0   val1p1       1      1 1
# 6       5       0        0   val1p2       1      1 2
# 7       9       1        0   val1p2       1      1 2
# 8      10       0        1   val1p3       1      1 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2017-04-20
    • 2018-01-21
    • 2016-07-27
    相关资源
    最近更新 更多