首页 > 解决方案 > 基于多列和多行条件的嵌套条件语句

问题描述

我正在尝试创建一个物种共现矩阵。我有一个数据框 bd

species <- c("A","A","F","H","D","E","C","D")
ID <- c("a1", "a2", "f1", "h1", "d1", "e1", "c1", "d2")
loc <- c(1,2,2,1,3,5,2,3)
time <- c("8:00","9:00","9:00","10:00","12:00","12:00","1:00","2:00")
cn <- c(1:8)
data.frame(species, ID, loc, time, cn)

species  ID  loc  time cn
1   A    a1   1   8:00  1
2   A    a2   2   9:00  2
3   F    f1   2   9:00  3
4   B    b1   1  10:00  4
5   D    d1   3  12:00  5
6   E    e1   5  12:00  6
7   C    c1   2   1:00  7
8   D    d2   3   2:00  8

我想为共现创建一个有条件的“标准”,以便:

如果物种 [x] 在 +/- 1 个位置内和以下任一位置的 1 小时内被发现:

2种A | 1 种 A 和 1 种 B | 1种C

然后,将这些物种计为共同出现并粘贴(物种,ID,sep =“。”),如果不是,则为0。

我的代码看起来像这样:

instance <- as.data.frame(with(b.d, sapply(cn, function(x)
    ifelse(abs(loc- loc[x]) <=1 & abs(difftime(time, time[x], units = "mins")) <= 60 &
        ((b.d$species[x]=="A" & b.d$species[x]=="A")
        | (b.d$species[x]=="A" & b.d$species[x]=="B")
               | b.d$species[x]=="C"), 
           paste(b.d$species,b.d$ID,sep="."),0)))) 

最后我想得到一个包含 cn(=8) 列和行数的矩阵,其中每列包含根据标准一起观察到的物种。所以,

    V1    V2    V3    V4   V5    V6    V7   V8
1  A.a1  A.a1  A.a1   0     0     0    0     0
2  A.a2  A.a2  A.a2  A.a2   0     0    0     0
3  F.f1  F.f1  F.f1  F.f1   0     0    0     0
4  0     B.b1  B.b1  B.b1   0     0    0     0
5  0      0     0     0     0     0    0     0
6  0      0     0     0     0   E.e1  E.e1  E.e1
7  0      0     0     0     0   C.c1  C.c1  C.c1
8  0      0     0     0     0   D.d2  D.d2  D.d2

上面的代码适用于位置和时间标准,但物种[x] 标准不知何故搞砸了。只有第一个参数 (species[x]=="A") 被应用,其余的结果为零。我认为 sapply 函数正在逐行读取物种 [x] ,因此物种 [x] 一次只能代表 1 个物种,我该如何解决这个问题,以便每行都与其他多行进行检查?那么物种[x] 可以代表物种的组合吗?

谢谢你。

标签: rconditional-statementssapply

解决方案


推荐阅读