我正在重组物种名称的数据集。它有一个带有拉丁名称的列和具有普通名称的列(如果可用)。我想制作第3列,在可用时给出琐碎的名称,否则为拉丁名称。琐碎的名字和拉丁名字都属于因子级。 我试过if-loop:
if(art2$trivname==""){
art2$artname=trivname
}else{
art2$artname=latname
}
它给了我正确的trivnames,但在提供拉丁名字时只给出了NA 当我使用ifelse时,我只会得到数字。
一如既往,所有帮助表示赞赏:)
答案 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)