> toupper("abc") [1] "ABC" > tolower("ABC") [1] "abc" > chartr("AB", "ab", "ABC") # AB だけを置換 [1] "abC"それでは「最初の一文字だけ置換」 やりたければどうすればよいか? たとえば最初の一文字だけがヘンな場合は簡単で
> tolower("Abc") [1] "abc"となる. それでは
abc
を Abc
としたい場合には?
これは残念ながら単純ではないらしく,
さきほどの
toupper(), tolower() のhelp()
の Examples
にあるような関数
capwords <- function(s, strict = FALSE) { cap <- function(s) paste(toupper(substring(s,1,1)), {s <- substring(s,2); if(strict) tolower(s) else s}, sep = "", collapse = " " ) sapply(strsplit(s, split = " "), cap, USE.NAMES = !is.null(names(s))) }なんかを定義して使わないとダメみたいだ.
> capwords(c("abc", "xyz")) [1] "Abc" "Xyz"
屋久島 MCMC 計算 (莫大な量) / 「直前」データ解析こんさる / 東京出張 / センター試験監督 / 統計学授業準備をこなせたのに, 今年は
屋久島 MCMC 計算 (ちょっと) / 「直前」データ解析こんさる / 統計学授業準備だけでへろへろしている. 嗚呼 ……
> (d <- data.frame(group = c(rep("a", 5), rep("b", 5)), x = rpois(10, 3), y = rpois(10, 9))) group x y 1 a 2 7 2 a 0 9 3 a 3 14 4 a 4 15 5 a 4 12 6 b 1 8 7 b 3 7 8 b 5 12 9 b 1 11 10 b 9 6このときに, 「
group a, b
ごとに y
の最大値の行を抽出して新しい data.frame 作れ」
という問題があったとしよう
(x
列は操作に何の関係もない,
しかし「捨ててはいけない」列である).
この例題だと見ればわかるように group a
に関しては 4 行め,
group b
に関しては 8 行目をとってくればよい.
R にどう命令してやればそういう作業をやってくれるだろうか?
unlist(tapply(...))
使うと
> (s <- unlist(tapply(d$y, d$group, function(gy) 1:length(gy) == which.max(gy)))) a1 a2 a3 a4 a5 b1 b2 b3 b4 b5 FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSEこのように「どこに
group
ごとの最大値があるのか」
がわかるような vector を作り,
あとはこれを
> d[s,] group x y 4 a 4 15 8 b 5 12とすれば「
group
ごとに y
の最大値を含む行で構成された新しい data.frame」
が生成できる.
group
の並び順に注意!
あらかじめ sort しとく,
といった工夫が必要.