在R因子使用ifelse(Using ifelse on factor in R)

2019-09-18 20:39发布

我重组品种名称的数据集。 它有拉丁名和列用时可那些琐碎的名称列。 我想提出一个第三列可用时给人的俗名,否则拉丁名。 无论俗名和拉丁文学名是要素类。 我曾尝试使用if循环:

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

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

与往常一样,所有的帮助表示赞赏:)

Answer 1:

例:

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)默认将是大多数人更容易,但你去那里...)



Answer 2:

只得到数字表明,你只需要添加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”,因为它避免了循环)刚刚分配artnametrivial一刀切,然后覆盖空白的人与latname ...

art2 = art
art2$artname = as.character(art$trivname)
changeme = which(art2$artname=="")
art2$artname[changeme] = as.character(art$latname[changeme])


Answer 3:

如果ART2是数据帧,并artname新列,另一种可能的解决方案:

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

如果你想在新列因素:

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


文章来源: Using ifelse on factor in R