7

種名のデータセットを再構築しています。ラテン語の名前の列と、利用可能な場合は慣用名の列があります。利用可能な場合は慣用名、それ以外の場合はラテン語の名前を示す3番目の列を作成したいと思います。慣用名とラテン語の名前はどちらもfactor-classにあります。私は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

(オプション(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))

artname全体的に割り当ててからtrivial、空白のものをlatname...で上書きする方がおそらく簡単です(ループを回避するため、より「R-thonic」になります)

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 に答える