・お題:データの型が合わないと、うまく処理してくれない。データの型の確認方法や、変更方法をメモしておきたい。
・とりあえず、オブジェクトを作ってみる。
> a<-1
> b<-"2"
・それぞれのオブジェクトの型を確認する。Rではclass関数で出てくるっぽい。もっと正確には、以下のサイトのように型の概念が存在するらしい。
・とりあえず、class関数でみてみる。
> class(a)
[1] "numeric"
> class(b)
[1] "character"
・例えば、それぞれのオブジェクトに1を足したいが、そのまま1を足すと案の定、characterで認識されているbでエラーが出た。
> a+1
[1] 2
> b+1
Error in b + 1 : non-numeric argument to binary operator
・Rで型を変更する場合、as.関数を使う。これには非常に多くの関数が用意されており、as.まで入力すると候補がたくさん出てくる。ここから選んで使えばOKっぽい。
・例えば、文字列として認識されているbを数字の2として認識させたければ、as.numeric関数を使えばいけそう。ただし、数字の2にはなるけれど、bに数字の2が代入されるわけではないので、代入してあげる必要がある。
> b<-as.numeric(b)
> b
[1] 2
・文字列を処理する際に、paste関数でくっつけることがある。numeric型だとうまくいかないからcharacterにしなきゃなぁ、、と思ったところ、何故かうまくいく。例が悪かったけれど、as.character関数があるので、これで文字に型を変えられる。
> paste("A","B",sep="")
[1] "AB"
> paste("a",a,sep="")#なんかできた。
[1] "a1"
> as.character(a)
[1] "1"
・データフレームでもやってみる。とりあえず、データフレームを作る。
> col1<-c("1","2","3","4")
> col2<-c("a","b","c","d")
> df<-data.frame(col1,col2)
> df
col1 col2
1 1 a
2 2 b
3 3 c
4 4 d
> str(df)
'data.frame': 4 obs. of 2 variables:
$ col1: chr "1" "2" "3" "4"
$ col2: chr "a" "b" "c" "d"
・col1をnumericに変更してみる。
> df$col2<-as.numeric(df$col2)
> str(df)
'data.frame': 4 obs. of 2 variables:
$ col1: num 1 2 3 4
$ col2: chr "a" "b" "c" "d"
・ちなみに、col2を無理やりnumericに変えてみると、NAになる。coercionは無理やりデータ型を変えられちゃいました、ということらしく、NAは一応numericらしい。データが飛んでしまった。
> as.numeric(df$col2)
[1] NA NA NA NA
Warning message:
NAs introduced by coercion
・これを何とかするには、データ型によって処理を変える必要が出てくるのかなと思う。is.関数で、そのデータの型が何か調べられるっぽい。
> is.numeric(1.234)
[1] TRUE
> is.numeric("1.234")
[1] FALSE
> is.numeric("a")
[1] FALSE
・データ型が混在して入力したベクトルは、例えば以下の例だとcharacterになったりする。ベクトルはデータ型の混在を許容しないので、仕方なしで変えてくれるっぽい。
> test<-c(1,2,"3","d")
> str(test)
chr [1:4] "1" "2" "3" "d"
・では、これをas.numericするとどうなるか。数字にできるものは数字にして、無理っぽいのはNAに強制的に変換してくれる。
> as.numeric(test)
[1] 1 2 3 NA
おわり。