在R中使用ifelse on factor

时间:2012-06-30 15:02:01

标签: r if-statement r-factor

我正在重组物种名称的数据集。它有一个带有拉丁名称的列和具有普通名称的列(如果可用)。我想制作第3列,在可用时给出琐碎的名称,否则为拉丁名称。琐碎的名字和拉丁名字都属于因子级。 我试过if-loop:

  if(art2$trivname==""){  
    art2$artname=trivname   
    }else{  
      art2$artname=latname  
    }  

它给了我正确的trivnames,但在提供拉丁名字时只给出了NA 当我使用ifelse时,我只会得到数字。

一如既往,所有帮助表示赞赏:)

3 个答案:

答案 0 :(得分:6)

示例:

art <- data.frame(trivname = c("cat", "", "deer"), latname = c("cattus", "canis", "cervus"))
art$artname <- with(art, ifelse(trivname == "", as.character(latname), as.character(trivname)))
print(art)
#   trivname latname artname
# 1      cat  cattus     cat
# 2            canis   canis
# 3     deer  cervus    deer

(我认为默认选项(stringsAsFactors = FALSE)对大多数人来说会更容易,但是你去......)

答案 1 :(得分:1)

仅获取数字表示您只需要在分配中添加as.character,而if-else可能也可以使用,您似乎也没有在分配中引用数据框?

if(as.character(art2$trivname)==""){  
    art2$artname=as.character(art2$trivname)
    }else{  
      art2$artname=as.character(art2$latname)
    }  

选项2:使用ifelse

 art2$artname= ifelse(as.character(art2$trivname) == "", as.character(art2$latname),as.character(art2$trivname))

可能更容易(并且更多“R-thonic”,因为它避免了循环)只是将artname分配给trivial,然后用latname覆盖空白的art2 = art art2$artname = as.character(art$trivname) changeme = which(art2$artname=="") art2$artname[changeme] = as.character(art$latname[changeme]) ...

{{1}}

答案 2 :(得分:1)

如果 art2 是数据框, artname 是新列,则另一种可能的解决方案:

art2$artname <- as.character(art2$trivname)
art2[art$artname == "",'artname'] <- as.character(art2[art2$artname == "", 'latname'])

如果您想要新列中的因素:

art2$artname <- as.factor(art2$artname)