試行錯誤中なのでひどいやりかたをしている可能性はあるので指摘歓迎.
read.csvしてきたdata.frameに対して,加工をいろいろやっている.どうやら文字列操作は素のままではあまり得意じゃないらしいことはわかってきた.文字列比較のための演算子は用意されておらず,grep とか gsub とかを使ってなんとかするっぽい.
適当なdata.frameについて,加工したものを新しいdata.frameに入れるのがセオリーっぽい.ということは,ある条件を満たす場合にフィールドに値を入れて追加するのならこんな感じか.
(transform(iris,ifsetos=ifelse(grepl("setos",Species),"yes", "NA")))
iris の Species で setos で部分文字列マッチ(grepl)したものについて,ifsetos という新たに追加したフィールド(transformによって)に"yes"を追加.マッチしない(elsifで)場合は"NA"を入れておく.
はまりポイント
- grep 使うと真偽値じゃないものが返ってしまうらしく期待した動作にならずはまった.
- Char型ではなくFactor型になってしまうとelseで元の文字列を返したつもりが数字になってはまる.
- read.csv("hog.csv",as.is=T)
- hoge$hoge <- as.character(hoge$hoge)
多分もっとエレガントな方法はあると思うんだけど,とりあえず.