【问题标题】:Using ifelse on factor in R在 R 中对因子使用 ifelse
【发布时间】:2012-06-30 15:02:00
【问题描述】:
我正在重组一个物种名称数据集。它有一个带有拉丁名称的列和一个带有琐碎名称的列(如果可用)。我想创建一个第三列,在可用时给出琐碎的名称,否则是拉丁名称。琐碎名称和拉丁名称都属于因子类。
我尝试过使用 if 循环:
if(art2$trivname==""){
art2$artname=trivname
}else{
art2$artname=latname
}
它给了我正确的 trivnames,但只在提供拉丁名称时给出 NA。
当我使用 ifelse 时,我只会得到数字。
一如既往,感谢所有帮助:)
【问题讨论】:
标签:
r
if-statement
r-factor
【解决方案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
(我认为 options(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))
将artname 分配给trivial 可能更容易(而且更“R-thonic”,因为它避免了循环),然后用latname 覆盖空白的...
art2 = art
art2$artname = as.character(art$trivname)
changeme = which(art2$artname=="")
art2$artname[changeme] = as.character(art$latname[changeme])
【解决方案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)