在R中使用ifelse处理因子变量

7

我正在重组一个物种名称的数据集。其中一列是拉丁名,另一列是当有时的常用名称。我想创建第三列,在常用名称可用时给出常用名称,否则给出拉丁名。常用名称和拉丁名都属于因子类。 我尝试使用if循环:

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

它给出正确的trivnames,但在提供拉丁名时仅返回NA。
当我使用ifelse时,我只得到数字。
像往常一样,非常感谢你的帮助 :)
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

我认为将选项(stringsAsFactors = FALSE)设置为默认值会更容易让大多数人理解,但是这就是现状...


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”,因为它避免了循环)的方法是将artname直接分配给trivial,然后用latname覆盖空白的部分...

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

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接