r语言 - 计算存在缺席矩阵中多列与单个列匹配的位置



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

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 中特有物种的数量!

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

显然,我无法对行求和,因为同一物种出现在不同的地块中。我尝试使用变异来组合地块,首先将山谷分开......

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

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

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

第一次...仔细检查重复部分!!

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

最新更新