2

关于具有多个测量变量的条件语句,我遇到了一些障碍。简而言之,我有两个以向量形式测量的栖息地梯度,一个基于两个栖息地梯度值的栖息地类型分类方案,我想编写一些代码,允许我将所有 5K 样本分类为一个使用两次测量的栖息地类型。如果我一次给它一个样本,我可以生成一些代码,给我一个很好的输出:

(简化版)

hab.assign<-function(HabA,HabB){
if(HabA < 5 & HabB < 5){
habitat<-c("Habitat Type 1")} else
if(HabA > 5 & HabB < 5){
habitat<-c("Habitat Type 2")} else
if(HabA < 5 & HabB > 5){
habitat<-c("Habitat Type 3")} else
if(HabA < 5 & HabB < 5){
habitat<-c("Habitat Type 4")}
habitat
}

现在,如果我编写一段代码将该函数应用于整个 5K 样本中的两个向量,可以这样说:

all.habs<-function(HabA,HabB){
n<-length(HabA)
hab.units<-vector("character",n)

hab.assign<-function(HabA,HabB){
if(HabA < 5 & HabB < 5){
habitat<-c("Habitat Type 1")} else
if(HabA > 5 & HabB < 5){
habitat<-c("Habitat Type 2")} else
if(HabA < 5 & HabB > 5){
habitat<-c("Habitat Type 3")} else
if(HabA < 5 & HabB < 5){
habitat<-c("Habitat Type 4")}
habitat
}

for(i in 1:n){
ind.hab<-hab.assign()
hab.units[i]<-ind.hab
}
hab.units
}

如果我只给它一个样本,它当然仍然会输出一个有意义的答案,但是完整的向量会给我一个错误消息:

警告消息:在 if (HabA < 5 & HabB < 5) { :条件的长度 > 1 并且只使用第一个元素

有谁知道如何克服这个特殊的障碍?

4

1 回答 1

5

也许

hab.assign <- function(HabA,HabB){
  ifelse(HabA < 5 & HabB < 5,
            "Habitat Type 1",
   ifelse(HabA > 5 & HabB < 5,
            "Habitat Type 2",
   ifelse(HabA < 5 & HabB > 5,
            "Habitat Type 3",
   ifelse(HabA < 5 & HabB < 5,
            "Habitat Type 4","weird habitat"))))
}

对于这个特定问题,可能有更聪明/更快的解决方案,基于基于组合推导整数代码,例如

code <- 1+as.numeric(habA>5)+as.numeric(habB>5)*2

对于两个 <= 5 的栖息地,它应该评估为 1,对于habA<=5和,应该评估为 2 habB>5,依此类推。然后,您可以使用switch语句来分配代码,或相应地分配因子的级别。但这种ifelse方法可能更具可读性。

于 2013-01-12T18:57:44.793 回答