2010年9月12日日曜日

gsubの使い方メモ

今回のスクリプトは文字列ベクトルの先頭の大文字をとってくるという
ことである。中には空白があったりするので、そのための処理を行う必要がある。
Rでも正規表現を用いることができるということで試してみた。

strs <- c("Hello World","Programming C","LISt Programming","isUpper")
# これで大文字でない箇所を空文字に置き換える
strs.abbr <- gsub("[^A-Z]","",strs) 
strs.abbr
# 先頭の大文字だけを抽出する
strs.split <- strsplit(strs," ");
head.concat <- function(x){
  head.chars <- substring(x,1,1) # 単語の先頭の文字群を得る
  head.upper <- gsub("[^A-Z]","",head.chars) # 大文字だけにする 
  paste(head.upper,collapse="") # 大文字のベクトルを結合
}
strs.abbr.head <- lapply(strs.split,head.concat)
strs.abbr.head <- unlist(strs.abbr.head)
strs.abbr.head

実行結果は以下のようになる。2番目の例では、途中の大文字は消去されている
ことが確認できる。

> strs.abbr
[1] "HW"   "PC"   "LISP" "U" 
> strs.abbr.head
[1] "HW" "PC" "LP" ""  

2010年9月1日水曜日

グループごとに複数の統計量を返す方法の検討

以前紹介したaggregate関数はグループごとにスカラー値を返す
関数をオプション(FUN)に指定するが、分位点を求めるquantile関数のように、
複数の値を返す方法はないかと尋ねられたので、以下のコードを作成した。

set.seed(1234)
let <- sample(letters[1:2],100,rep=T) # lettersはa-zが入っている
letN <- paste(let,c(rep(1,50),rep(2,50)),sep="")
dat <- iris[1:100,1] # アヤメデータから借用

d <- data.frame(let,letN,dat) # データの作成

dsp <- split(d,list(paste(d$let,d$letN,sep="_")))
res <- lapply(dsp,function(x){return(quantile(x$dat))})

dはダミーデータである。
dspはdをsplitしたものであるが、list(paste(d$let,d$letN,sep="_"))
ごとに区切るようにしている。この表現は何をキーにしてリストごとに分けるか
ということを指定しているのであるが、list(d$let,d$letN)では、
直積でリストを作成してしまうので、それを避けるために特殊な切り方にしている。

例えば1列目にはa,bという要素があり、2列目にはa1,a2,b1,b2という要素があるので、
リストは1,2列目の要素が
(a,a1),(a,a2),(a,b1),(a,b2),(b,a1),(b,a2),(b,b1),(b,b2)
となるように分けようとする。

しかしながら実際に1列目がa,2列目がb1という要素が無くても、
空のデータフレームからなるリストを作成しようとするので、それを嫌がって、
空のデータフレームが生成されるのを防いでいるのである。

最後の行にあるlapplyでdspに適用する関数は、無名関数と呼ばれるものを利用している。
通常の関数はmyfunc <- function(x) { ... } という形式が一般的であるが、
myfuncという関数名に相当する部分がなく、関数の定義のみで
記述されていることから無名関数と呼ばれている。
機能を何か所も使いまわすことがなく、かつ短い記述で済む場合に用いると
便利だと思われる機能である。

フォロワー

ページビューの合計