> 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 しとく,
といった工夫が必要.