#author("2019-07-21T10:22:06+09:00","","")
#author("2019-07-21T12:02:41+09:00","","")
#contents

* データの扱い [#wc23f00f]

** データの入力 [#f868ff48]

*** テキストファイルから取り込む:read.table() [#g476d708]
RIGHT:21 March 2018

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


*** 小さなデータなら直接書き込むほうが簡単 [#m9558310]
RIGHT: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))


*** 複数のデータを書いて、一辺に取り込ませることもできる [#y68ed8a1]
RIGHT: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")
 #
 }


** 重み付けデータの扱い [#n65b28bf]
RIGHT: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
 ... 

** データの操作 [#ee33cc27]
*** 行列の特定の数を置換 [#n1143f02]
RIGHT:23November2013

xという名前の行列の要素のうち、0のものを-1に置換
 x[(x==0)]<- -1

*** ifelse関数 [#ta84d18a]
RIGHT: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() : カテゴリ毎の記述統計を出力する [#w92d4e10]
RIGHT:20 July 2019

  library(psych)
  describeBy(mydf,mydfboth$Cross)



*** 転置: t() [#h3d68b2d]
RIGHT:20 July 2019

行列の縦横を転置する

 t(mymatrix)
 t(mydf)


*** [#t23bafa7]
RIGHT:20 July 2019
// *** [#t23bafa7]
// RIGHT:20 July 2019
// 
//   hsdtestout <- HSD.test(model, "EDnum")
// 
// mytestnum <- length(hsdtestout$group[[2]])
//         # HSD.test の結果の行数
//         
//         for(k in 1:mytestnum){
// 
// 
//                 # これまでの判断で、必ずアルファベットがあるはずなんだけど
//                 # NULL のときがあるようなので、NULL なら、空文字列と
//                # なるようにしておく
//                 myhsdtestlabel1 =
//                     as.character(hsdtestout$group[,2][k])
// #                    ifelse(
// #                        is.null(levels(hsdtestout$group[k,3])),
// #                        "",
// #                        levels(hsdtestout$group[k,3])
// #                    )

  hsdtestout <- HSD.test(model, "EDnum")



mytestnum <- length(hsdtestout$group[[2]])
        # HSD.test の結果の行数
        
        for(k in 1:mytestnum){


                # これまでの判断で、必ずアルファベットがあるはずなんだけど
                # NULL のときがあるようなので、NULL なら、空文字列と
                # なるようにしておく
                myhsdtestlabel1 =
                    as.character(hsdtestout$group[,2][k])
#                    ifelse(
#                        is.null(levels(hsdtestout$group[k,3])),
#                        "",
#                        levels(hsdtestout$group[k,3])
#                    )


*** names 属性を使ってデータに名前を付ける:names() [#a9de31bd]
RIGHT:21 March 2018

dataframe ではなくても可
 names(mydf) <- "Crosses with D. melanogaster males "

*** カラム名を変更:names() [#o0f1a07a]
RIGHT:21 March 2018

dataframe ではなくても可~
全部変更(または名付け)
 names(mydf2) <- c("cross", "time")


** dataframe の操作 [#oace8ba3]

*** dataframe の全てのデータに代入 [#mc19cb5b]
RIGHT:21 March 2018

 mydf$Order <- 0

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

 > mydf <- 0
 > mydf
 [1] 0


*** dataframe に条件に一致するものだけに代入する(置換) [#a18a7df4]
RIGHT:21 March 2018

 mydf[mydf<0] <- NA
 mydf2[mydf2==0] <- NA

*** dataframe に条件に一致するものだけに代入する(置換) [#z934b76a]
RIGHT: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 から条件に一致するものだけ取り出す [#u6fd86e5]
RIGHT: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 から条件に一致するものだけ取り出す [#ea82d279]
RIGHT: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() [#oa885987]
RIGHT:21 March 2018

 mydf2 <- subset(mydf, Order>0)

*** dataframe から条件に一致するものだけ取り出す:subset() [#n0a84a56]
*** as.matrix(): dataframe を matrix に変換 [#zf9b948e]
RIGHT: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() [#j716403a]
RIGHT:21 March 2018

これは for文の中の一部分のコードで i や j を使っての操作
 mychar1 <- as.character(mydf1$factor1[i])
 mychar2 <- as.character(mydf2$factor2[j])


*** dataframe から条件に一致する factor を文字列リストとして取り出す:as.character() [#i832b128]
RIGHT:23 March 2018

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

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


*** dataframe にデータを加える(横):cbind() [#id9fd35d]
RIGHT:21 March 2018

ここでは演算していますが、別な dataframe を右に付けることもできる~
サイズは一致していないとヘンなことになるので注意が必要
 mydf <- cbind(mydf, mydf$N-mydf$Copulated)


*** dataframe にデータを加える(下):rbind() [#m57d5548]
RIGHT:21 March 2018

カラム名が一致しないと上手くいかない
 mydf <- rbind( mydf, data.frame(columnname1="Dummy", columnname2=NA))


*** dataframe からカラムを取り出し、結合する:cbind() [#ld49835b]
RIGHT:21 March 2018

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


*** カラム名を変更:names() [#l8b39ac3]
RIGHT:21 March 2018

全部変更(または名付け)
 names(mydf2) <- c("cross","time")

*** カラム名を変更:names()[] [#i35f7692]
RIGHT:21 March 2018

何番目のカラムかを意識しないといけません
 names(mydf)[3] <- "NotC"


*** 空の因子レベルを取り除く:droplevels() [#a8afd7a5]
RIGHT:21 March 2018

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


*** dataframe を表示させる:show() [#o4144613]
RIGHT:21 March 2018

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

*** dataframe の行数のカウント:nrow() [#x979fc62]
RIGHT:21 March 2018

 x <- nrow(mydf)


***データの扱いについてのメモ [#o15a1bfb]
RIGHT: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:&counter(today); |Yesterday:&counter(yesterday); |Total:&counter(); since 21 July 2019|

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS