r-statistics-fanの日記

統計好きの現場の臨床医の覚書のようなもの

自分のRのデータフレームの内容を、メールやblogなどで伝え、他人のRで再現させる関数

#10/31追記
データフレームの内容をテキスト化 - r-statistics-fanの日記

なんとdput()関数で目的のことは出来るようです。
苦労する必要はなかったんや~
##追記終了

メールやblogなどで、自分の環境上のデータフレームを記載したいことがある。
しかし、a <- c(1,3,5)などといちいち手入力するのは大変。
データフレームの内容を自動でそのまま、Rにコピペできる形にできたら楽ですよね。
そんな関数。

#2014.10.30一部バグ修正

以前作った関数を少し改良した。

慶応がベストのデータも、これを使った。
まずエクセルに入力、次にRに読み込み、df2txt()でコピペ
という流れだ。日本語でも行けたのでまずは良しとする。
ただ、まだ日付がなあ。例外的なものにも弱いし。

df2txt <- function(new.data = "dat", dat = data){  #新しく作るdata, txt化するデータ
      nr <- nrow(dat)
      nc <- ncol(dat)
      cn <- colnames(dat)      
      cat(new.data, "<- data.frame(numeric(", nr, "))\n")
      for (i in 1:nc){
            cat(paste(new.data, "$", cn[i], "=", "c(", paste(dat[,i], collapse=","), ")\n"))
      }
      cat(new.data, "<-", new.data, "[,-1]\n")
}

df2txt("data2", dat)

dat <- data.raw

df2txt <- function(new.data = "dat", dat = data){  #新しく作るdataの名前, txt化するデータフレーム名
      nr <- nrow(dat)
      nc <- ncol(dat)
      cn <- colnames(dat)      
      
      col.factor <- as.numeric(sapply(dat, is.factor))
      name.factor <- names(which(sapply(dat, is.factor)))
      
      col.numeric <- as.numeric(sapply(dat, is.numeric))
      name.numeric <- names(which(sapply(dat, is.numeric)))
      
      col.chr <- as.numeric(sapply(dat, is.character))
      name.chr <- names(which(sapply(dat, is.character)))
      
      col.other <- as.numeric((col.factor + col.numeric + col.chr)==0)
      name.other <- cn[which(col.other == 1)]
      
      if(sum(col.numeric) != 0){
            for (i in name.numeric){
                  cat(i, "=", "c(", paste(dat[,i], collapse=","), ")\n")
            }
      }
      
      
      if(sum(col.chr) != 0){
            for (i in name.chr){
                  cat(i, "=", "as.character(c(", paste("\x22", dat[,i], "\x22", collapse=",", sep = ""), "))\n")
            }
      }
      
      if(sum(col.factor) != 0){
            for (i in name.factor){
                  cat(i, "=", "as.factor(c(", paste("\x22", dat[,i], "\x22", collapse=",", sep = ""), "))\n")
            }
      }
      
      if(sum(col.other) != 0){
            for (i in name.other){
                  cat(i, "=", "as.character(c(", paste("\x22", dat[,i], "\x22", collapse=",", sep = ""), "))\n")
            }
      }
      
      
      cat(new.data, "<- data.frame(", paste(cn, "=", cn, collapse = ","), ")\n")
}

df2txt("data", data) #とするとdataの内容が例えば下記のように出力される

good = c( 2170,1838,1041,580,1596,496,374,520,250,256,209,231,163,144,230,113,140,103,217,110,65,123,57,50,24,68,22,16,21,18,139 )
bad = c( 536,684,328,115,1161,79,108,322,62,81,41,105,52,59,165,52,82,50,171,66,28,88,22,18,0,44,5,0,9,7,128 )
univ = as.character(c( "慶応大学","早稲田大学","京都大学","一橋大学","東京大学","東京工業大学","大阪大学","明治大学","東北大学","東京理科大学","国際基督教大学","同志社大学","神戸大学","北海道大学","上智大学","名古屋大学","関西学院大学","筑波大学","中央大学","九州大学","東京外国語大学","横浜国立大学","電気通信大学","津田塾大学","ハーバード大学","千葉大学","広島大学","国際教養大学","小樽商科大学","京都工芸繊維大","立教大学" ))
data <- data.frame( univ = univ,good = good,bad = bad )


#上記をblogなどに貼り付ければ、他の人にもdataの内容が再現できる