7

我正在重组一个物种名称数据集。它有一个带有拉丁名称的列和一个带有琐碎名称的列(如果可用)。我想创建一个第三列,在可用时给出琐碎的名称,否则是拉丁名称。琐碎名称和拉丁名称都属于因子类。我尝试过使用 if 循环:

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

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

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

4

3 回答 3

8

例子:

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

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

于 2012-08-08T16:57:37.357 回答
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])
于 2014-05-13T04:44:03.350 回答
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)
于 2014-07-24T05:55:17.833 回答