データの扱い

データの入力

テキストファイルから取り込む:read.table()

21 March 2018

データフレームとして取り込まれる
header=TRUE 1行目がカラム名として取り込まれる
fill=TRUE 空のデータがあるとき、空欄が取り込まれる(事故が起こらないか注意が必要)

mydf <- read.table("data.txt", header=TRUE)
mydf <- read.table("data.txt", header=TRUE, fill=TRUE)

小さなデータなら直接書き込むほうが簡単

21 March 2018

データの部分をスプレッドシートからコピー&ペーストできる利点あり
textConnection() を使って偽装することで実現できる

myinput <- ("
Female[tab]Copulated[tab]N
'Oregon-R'[tab]96[tab]100
'Canton-S'[tab]86[tab]100
'Hikone-R'[tab]92[tab]100
")
#
#names 属性を使ってデータに名前を付ける
names(myinput) <- "Crosses of D. melanogaster"
#
# dataframe に読み込ませる
# textConnection() を使って偽装する
mydf <- read.table(textConnection(myinput))

複数のデータを書いて、一辺に取り込ませることもできる

21 March 2018

myinput1 から myinput5 までは上のように作っておく
for 文にすれば、関数を作らなくても複数処理できる
for 文の中では表示されないものが出てくるので、show での対応が必要

myinputall <- c(
    myinput1,
    myinput2,
    myinput3,
    myinput4,
    myinput5
)
#
mydataset <- length(myinputall)
#
for(i in 1:mydataset) { 
    mydf <- read.table(textConnection(myinputall[i]),
                       header=TRUE,
                       row.names=1)
#
   # ココにそれぞれの処理
   cat("\n------------------------------------------------------------\n",
       names(myinputall[i]),
       "\n\n")
#
}

重み付けデータの扱い

21 March 2018

重み付けデータはRでは扱いづらい(しかし、データの取り方がこうなることがある)
そこで、個々のデータの形に集計し直す survival analysis のデータはこのままでいいのだけど

プログラム引用:R numericとfactorの相互変換 https://siguniang.wordpress.com/2010/09/30/rnumericとfactorの相互変換/

ある時間に対してイベントが起きた個体数を記録したデータ

> weightdata.txt
Time	Data1	Data2	Data3	...	Data11
1	6	4	5		7
2	1	1	0		1
...

各個体がそのイベントが起きたデータを持つという形に変換する

mydf <- read.table("weightdata.txt", header=TRUE)
#
# matrix に変換
mymat <- data.matrix(mydf)
#
# 頻度データを個々のデータに変換する
mydf2 <- 
    cbind(
    #
    # 数値データの数だけ、名前(交配)を並べる
        data.frame(c(
            rep(colnames(mymat)[2], sum(mymat[,c(2)])),
            rep(colnames(mymat)[3], sum(mymat[,c(3)])),
            rep(colnames(mymat)[4], sum(mymat[,c(4)])),
            rep(colnames(mymat)[5], sum(mymat[,c(5)])),
            rep(colnames(mymat)[6], sum(mymat[,c(6)])),
            rep(colnames(mymat)[7], sum(mymat[,c(7)])),
            rep(colnames(mymat)[8], sum(mymat[,c(8)])),
            rep(colnames(mymat)[9], sum(mymat[,c(9)])),
            rep(colnames(mymat)[10], sum(mymat[,c(10)])),
            rep(colnames(mymat)[11], sum(mymat[,c(11)]))
        )),
     #
     # 数値データを作成   
     # 頻度の回数だけ反復する
     #
     # 単純に dataframe にすると   
     # なぜか数値データもファクター扱いになってしまう
     # そこで、数値に変換してから data.frame に変換する
     # https://siguniang.wordpress.com/2010/09/30/rnumericとfactorの相互変換/
     # as.numeric(as.character(size))
     #        
        data.frame(as.numeric(
            c(
                rep(mymat[,1], mymat[,c(2)]),
                rep(mymat[,1], mymat[,c(3)]),
                rep(mymat[,1], mymat[,c(4)]),
                rep(mymat[,1], mymat[,c(5)]),
                rep(mymat[,1], mymat[,c(6)]),
                rep(mymat[,1], mymat[,c(7)]),
                rep(mymat[,1], mymat[,c(8)]),
                rep(mymat[,1], mymat[,c(9)]),
                rep(mymat[,1], mymat[,c(10)]),
                rep(mymat[,1], mymat[,c(11)])
            )
        ) )
)

結果

> mydf2
  [長い名前] [長い名前]
1  Data1        1
2  Data1        1
...
6  Data1        1
7  Data1        2
... 

カラム名が変換操作をした履歴を示す「長い変な名前」になってしまう
そこで、変換しておかないとニンゲンが理解できなくなる

> names(mydf2) <- c("cross","time")
> mydf2
   Cross     time
1  Data1        1
2  Data1        1
...
6  Data1        1
7  Data1        2
... 

データの操作

行列の特定の数を置換

23November2013

xという名前の行列の要素のうち、0のものを-1に置換

x[(x==0)]<- -1

ifelse関数

18 July 2019

if と else を使ったものより簡単な判断に使える
返り値が複雑なものはややこしいことになるので、複雑なことをしたいなら、 普通に if(){} elsif(){} else{} を使うべし

ifelse(判断(TRUE か FALSE が返るもの), TRUEのときの返り値, FALSEのときの返り値)
ifelse(mydfboth$Court1<mydfboth$Court2,"Male1","Male2")

# offset を調整する off = -(mymatrix[1,] + mymatrix[2,])

describeBy() : カテゴリ毎の記述統計を出力する

20 July 2019
 library(psych)
 describeBy(mydf,mydfboth$Cross)

転置: t()

20 July 2019

行列の縦横を転置する

t(mymatrix)
t(mydf)

names 属性を使ってデータに名前を付ける:names()

21 March 2018

dataframe ではなくても可

names(mydf) <- "Crosses with D. melanogaster males "

カラム名を変更:names()

21 March 2018

dataframe ではなくても可
全部変更(または名付け)

names(mydf2) <- c("cross", "time")

dataframe の操作

dataframe の全てのデータに代入

21 March 2018
mydf$Order <- 0

ここで、全データに同じ値を代入しようとして mydf <- 0 とすると痛い目にあう(笑)
R は自動で型変換をするので、この場合は、各データに代入されず、 同じ名前で dataframe から数値(integer)になってしまうというオチ

> mydf <- 0
> mydf
[1] 0

dataframe に条件に一致するものだけに代入する(置換)

21 March 2018
mydf[mydf<0] <- NA
mydf2[mydf2==0] <- NA

dataframe に条件に一致するものだけに代入する(置換)

23 March 2018

factor(ここでは MyFactor)が、Mylist のいずれかと一致する場合、Cat1 に 0 を代入
for loop を使わずに1行でできてしまう ← すごい
文字列が一致のときは、match が integer の 1 を返す
文字列が不一致のときは、match が integer の NA を返す
NA は FALSE の代りにはならないので、is.na() を利用

mydf$Cat1[is.na(match(mydf$MyFactor, Mylist))==FALSE] <- 0

dataframe から条件に一致するものだけ取り出す

23 March 2018

mydf の Factor1 と同じものを、Factor2 に持つ mydf2 のデータを選び出す
mydf$Factor1 の代わりに上のように Mylist にもできるはず
FALSE の後の コンマ は必須
一致の判断は上述

mydf22 <- mydf2[!is.na(match(mydf2$Factor2, mydf$Factor1)),]       # 行全て
mydf22 <- mydf2[is.na(match(mydf2$Factor2, mydf$Factor1))==FALSE,] # 「!」でなくても
mydf22 <- mydf2$Cat1[!is.na(match(mydf2$Factor2, mydf$Factor1)),]  # あるカラムだけの取り出し

dataframe から条件に一致するものだけ取り出す

25 March 2018

条件は & や | を使ってふたつ以上の使える

mydf$Cat1[mydf$Cat1 > 0] # あるカラムについて正の値のみ取り出し
mydf$Cat2[mydf$Cat1 > 0] # あるカラムについて正の値の場合の、別なカラムの取り出し
mydf$Cat2[!(mydf$Cat1 > 0)] # あるカラムについて正ではない場合の、別なカラムの取り出し
mydf$Cat3[!(mydf$Cat1 > 0) & (mydf$Cat2 > 0)] # Cat1 が0以下 かつ Cat2 が正の場合の、Cat3の取り出し
mydf$Cat3[!(mydf$Cat1 > 0) | (mydf$Cat2 > 0)] # Cat1 が0以下 または Cat2 が正の場合の、Cat3の取り出し

dataframe から条件に一致するものだけ取り出す:subset()

21 March 2018
mydf2 <- subset(mydf, Order>0)

dataframe から条件に一致するものだけ取り出す:subset()

as.matrix(): dataframe を matrix に変換

21 March 2018

subset= で行の抽出条件 ← Observed > 5 のデータの行を取り出すとき
select= で列の抽出条件、取り出し順序の変更もできる
as.matrix(): dataframe を matrix に変換

mydata <- as.matrix(subset(
                           mydf,
                           subset=Observed>5,
                           select=c(Courtship, Observed)
                          )
                   )

dataframe の factor を文字列として取り出す:as.character()

21 March 2018

これは for文の中の一部分のコードで i や j を使っての操作

mychar1 <- as.character(mydf1$factor1[i])
mychar2 <- as.character(mydf2$factor2[j])

dataframe から条件に一致する factor を文字列リストとして取り出す:as.character()

23 March 2018

Cat1 が 0 である factor(Myfactor)の取り出し

mycharlist <- as.character(mydf$Myfactor[mydf$Cat1==0])

dataframe にデータを加える(横):cbind()

21 March 2018

ここでは演算していますが、別な dataframe を右に付けることもできる
サイズは一致していないとヘンなことになるので注意が必要

mydf <- cbind(mydf, mydf$N-mydf$Copulated)

dataframe にデータを加える(下):rbind()

21 March 2018

カラム名が一致しないと上手くいかない

mydf <- rbind( mydf, data.frame(columnname1="Dummy", columnname2=NA))

dataframe からカラムを取り出し、結合する:cbind()

21 March 2018
mydf3 <- cbind(mydf2[,3:4], mydf2[,6:10])

カラム名を変更:names()

21 March 2018

全部変更(または名付け)

names(mydf2) <- c("cross","time")

カラム名を変更:names()[]

21 March 2018

何番目のカラムかを意識しないといけません

names(mydf)[3] <- "NotC"

空の因子レベルを取り除く:droplevels()

21 March 2018

操作した dataframe には、 元の dataframe の因子の情報(因子レベル)が含まれている
そこで、空の因子レベルを取り除かないと正しく検定できなくなってしまう
RWiki 因子Tips大全: http://www.okadajp.org/RWiki/?因子Tips大全

mydf2$Factor1 <- droplevels(mydf2$Factor1)

dataframe を表示させる:show()

21 March 2018

for 文の中では表示されないので、show() で対応する
http://d.hatena.ne.jp/yusap/20130514/1368486988 ヘのコメントを参照

show(
    mydf
)

dataframe の行数のカウント:nrow()

21 March 2018
x <- nrow(mydf)

データの扱いについてのメモ

11 July 2011
mytabledf <- data.frame(summary(myfit)$table)

とすると、myfit の出力テーブルがデータフレームになる。 str(mytabledf)で何が含まれているか分かる(records, n.max, n.start, events, median, X0.95LCL, X0.95UCL です)。 そこで、例えば、

mytabledf$median

で、(Kaplan-Meier estimate の)median だけが出てくる。

Today:1Yesterday:0Total:152 since 21 July 2019

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 21 Jul 2019 (日) 10:22:06 (186d)