忍者ブログ
Yaleで、遊んで学ぶ日々。

Yaleで、遊んで学ぶ日々。

囲碁、ときどきプログラミング、ところにより経済。
[1]  [2]  [3]  [4]  [5
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

日本で買ったPCなら何の苦もなくできることだが、米国で買ったものだと、そもそも日本語を表示することが念頭にないのか、Rコンソールの文字化けがなかなか治らなかった。3時間かかって何とか表示に成功したのでメモ。

実際に使ったデータは公開できないので以前使ったAKB48のデータで再現。
図のように、普通にデータを読み込んで表示すると日本語部分が文字化けしてしまう。
表示を正しくするには次のようにする。
①ファイルのエンコードはUTF-8にする。
②読み込み時に, encoding="UTF-8" オプションを付ける。
read.csv(filename, encoding="UTF-8")

すると、データフレームの表示がユニコード表示になる。ベクトルで抜き出して表示するときちんと日本語になるし、文字列の比較も上手くいく。

Capture.PNG
























PR
Rでdata.frameを扱っているときに、ある変数の値ごとに何らかの操作をしたい、ということがよくある。例えば、次のような身長と性別のデータがあるとして、「性別ごとに平均を出したい」のようなことだ。
> dat
   height gender
1  164.06      0
2  160.83      1
3  162.93      0
4  172.79      1
5  168.85      1
6  162.42      0
7  158.12      1
8  166.14      0
9  174.02      1
10 158.29      1


こういった操作は、by() 関数でできる。
> by(dat, dat$gender, mean)
dat$gender: 0
  height   gender
163.8875   0.0000
------------------------------------------------------------
dat$gender: 1
  height   gender
165.4833   1.0000


使い方は by(data, INDICES, FUN, ... ) で、
dataには対象となるdata.frame を、 INDICESには場合分けをするための変数を、FUNには使用する関数を与える。FUNの第1引数がdataの部分になり、FUNが他にも引数をとる場合には後に続ける。


例えばデータが欠損値を含んでいる場合、単にmean() で平均を出そうとすると欠損値が返ってくる。欠損値を無視するには、mean() を呼ぶ際に na.rm=T というオプションを加える。
> dat
   height gender
1  164.06      0
2  160.83      1
3      NA      0
4  172.79      1
5  168.85      1
6  162.42      0
7  158.12     1
8  166.14      0
9  174.02      1
10 158.29      1

> by(dat, dat$gender, mean)
dat$gender: 0
height gender
    NA      0
------------------------------------------------------------
dat$gender: 1
  height   gender
165.4833   1.0000

> by(dat, dat$gender, mean, na.rm=T)
dat$gender: 0
  height   gender
164.2067   0.0000
------------------------------------------------------------
dat$gender: 1
  height   gender
165.4833   1.0000
>



by() 関数の返り値は "by" というクラスなのだが、これはリストを継承する。したがって、インデックスで呼び出すなどの操作も可能。

> b <- by(dat, dat$gender, mean)

> b
dat$gender: 0
  height   gender
163.8875   0.0000
------------------------------------------------------------
dat$gender: 1
  height   gender
165.4833   1.0000

> names(b)
[1] "0" "1"

> b[[1]]   
  height   gender
163.8875   0.0000

> b[["1"]]
  height   gender
165.4833   1.0000

> b$`0`
  height   gender
163.8875   0.0000

上の例では0と1の意味する所が無意味に分かりにくくなってしまっているが、b[[1]] はリストの第1要素(つまりgender:0に対する部分)、b[["1"]] はgender:1に対する部分、b$`0`はgender:0に対する部分を抜き出している。



ちなみに、無理矢理代入することも一応できるようだ。
> b[[1]] <- "replaced"

> b
dat$gender: 0
[1] "replaced"
------------------------------------------------------------
dat$gender: 1
  height   gender
165.4833   1.0000




文字列を大文字・小文字に変換するには、toupper(), tolower() 関数を使う。

> toupper("United States of America")
[1] "UNITED STATES OF AMERICA"

> tolower("I live in Tokyo, Japan")
[1] "i live in tokyo, japan"



あるベクトルの累積和(第 j 要素がもとのベクトルの1~j 番までの和となるような同サイズのベクトル)を作りたいときは、cumsum() 関数を使う。

>cumsum(c(0,1,0,1,1,0))
[1] 0 1 1 2 3 3

> cumsum(c(0.1, 0.4, 0.2, 0.05, 0.15, 0.1))
[1] 0.10 0.50 0.70 0.75 0.90 1.00



Rによるディレクトリ・ファイル操作メモ


dir.create(): ディレクトリ作成。オプション recursive=TRUE を設定すれば階層のあるディレクトリ構造を作ることも可。

  * pythonでいう os.mkdir(), os.makedirs()



file.exists(): ファイルやディレクトリの存在を確認。

  * pythonでいう os.path.exists()



file.path(): パスの結合。

  * pythonでいう os.path.join()

Calender
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Search in This Blog
Latest Comments
[03/30 川内のばば山田]
[03/30 川内のばば山田]
[08/06 Aterarie]
[07/05 Agazoger]
[07/01 Thomaskina]
Oldest Posts
Latest Trackbacks
フリーエリア

Barcode
Access Analysis
Powerd by NINJAブログ / Designed by SUSH
Copyright © Yaleで、遊んで学ぶ日々。 All Rights Reserved.
忍者ブログ [PR]