データフレームとして取り込まれる
header=TRUE 1行目がカラム名として取り込まれる
fill=TRUE 空のデータがあるとき、空欄が取り込まれる(事故が起こらないか注意が必要)
mydf <- read.table("data.txt", header=TRUE) mydf <- read.table("data.txt", header=TRUE, fill=TRUE)
データの部分をスプレッドシートからコピー&ペーストできる利点あり
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))
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") # }
重み付けデータは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 ...
xという名前の行列の要素のうち、0のものを-1に置換
x[(x==0)]<- -1
if と else を使ったものより簡単な判断に使える
返り値が複雑なものはややこしいことになるので、複雑なことをしたいなら、
普通に if(){} elsif(){} else{} を使うべし
ifelse(判断(TRUE か FALSE が返るもの), TRUEのときの返り値, FALSEのときの返り値) ifelse(mydfboth$Court1<mydfboth$Court2,"Male1","Male2")
# offset を調整する off = -(mymatrix[1,] + mymatrix[2,])
library(psych) describeBy(mydf,mydfboth$Cross)
行列の縦横を転置する
t(mymatrix) t(mydf)
dataframe ではなくても可
names(mydf) <- "Crosses with D. melanogaster males "
dataframe ではなくても可
全部変更(または名付け)
names(mydf2) <- c("cross", "time")
mydf$Order <- 0
ここで、全データに同じ値を代入しようとして mydf <- 0 とすると痛い目にあう(笑)
R は自動で型変換をするので、この場合は、各データに代入されず、
同じ名前で dataframe から数値(integer)になってしまうというオチ
> mydf <- 0 > mydf [1] 0
mydf[mydf<0] <- NA mydf2[mydf2==0] <- NA
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
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)),] # あるカラムだけの取り出し
条件は & や | を使ってふたつ以上の使える
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の取り出し
mydf2 <- subset(mydf, Order>0)
subset= で行の抽出条件 ← Observed > 5 のデータの行を取り出すとき
select= で列の抽出条件、取り出し順序の変更もできる
as.matrix(): dataframe を matrix に変換
mydata <- as.matrix(subset( mydf, subset=Observed>5, select=c(Courtship, Observed) ) )
これは for文の中の一部分のコードで i や j を使っての操作
mychar1 <- as.character(mydf1$factor1[i]) mychar2 <- as.character(mydf2$factor2[j])
Cat1 が 0 である factor(Myfactor)の取り出し
mycharlist <- as.character(mydf$Myfactor[mydf$Cat1==0])
ここでは演算していますが、別な dataframe を右に付けることもできる
サイズは一致していないとヘンなことになるので注意が必要
mydf <- cbind(mydf, mydf$N-mydf$Copulated)
カラム名が一致しないと上手くいかない
mydf <- rbind( mydf, data.frame(columnname1="Dummy", columnname2=NA))
mydf3 <- cbind(mydf2[,3:4], mydf2[,6:10])
全部変更(または名付け)
names(mydf2) <- c("cross","time")
何番目のカラムかを意識しないといけません
names(mydf)[3] <- "NotC"
操作した dataframe には、
元の dataframe の因子の情報(因子レベル)が含まれている
そこで、空の因子レベルを取り除かないと正しく検定できなくなってしまう
RWiki 因子Tips大全: http://www.okadajp.org/RWiki/?因子Tips大全
mydf2$Factor1 <- droplevels(mydf2$Factor1)
for 文の中では表示されないので、show() で対応する
http://d.hatena.ne.jp/yusap/20130514/1368486988 ヘのコメントを参照
show( mydf )
x <- nrow(mydf)
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:6 | Yesterday:1 | Total:7325 since 21 July 2019 |