No.22015 R 文字列の生成  【明石】 2016/05/27(Fri) 22:10

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

Rプログラムについて,ご教示いただきたいことが出てきました。
どうぞ,よろしくお願いいたします。

------
添付の画像をご覧ください。

お示しをしました例題は,説明のためにサイズを小さくしてあります。

実際のデータは大規模であり,0要素が多くあるスパースなデータです。

入力データ("in.csv")を読み込み,以下のルールで,
テキストファイル("out.txt")を生成出力するRプログラムを作成しています。

【ルール】

・表のセルの数値(非負の整数)を読み取り,
 数値が1以上の場合には,
 セルの列名("aaa", "bbb", "ccc", "ddd", "eee")を,
 セルの数値の回数分を繰り返した文字列に置き換える。

・表のセルの数値(非負の整数)を読み取り,
 0の場合には,空文字に置き換える

・文字列のセパレータは,半角スペースとする。

以下のRプログラムを作成しましたが,2つの問題が残ります。
私の力では,解決できません。

良いお手本をお示しいただけると,大変に助かります。
どうぞ,よろしくお願いいたします。

【問題点】

・実際に利用するデータは大規模であることから,
 多重ループの処理を回避して,性能向上を図りたい。

・実際に利用するデータは0要素が多いことから,
 生成出力したテキストファイルには,区切り記号の半角スペースが多く混入します。

 この冗長な半角スペースを,gsub()関数で置換して削除しようと試みましたが,
 私の知識では,できませんでした。

以下,プログラムです。
dat <- read.table("in.csv",header=T, sep=",")

nr <- nrow(dat)
nc <- ncol(dat)

# セルの数字を文字列に置き換える
 
for(i in 1:nr) {
   for(j in 1:nc) {

   r <- dat[i,j] 

   if (r  >= 1) {
      v <- rep(colnames(dat)[j], r)
      v <- paste(v , collapse=" ")
      dat[i,j] <- v
   } 

   if (r == 0) {
     dat[i,j] <- ""
   } 
   }
}

gsub("  ", "", dat)

write.table(dat, "out.txt", col.names = F, row.names = F, quote = F, sep = " " )


No.22016 Re: R 文字列の生成  【青木繁伸】 2016/05/27(Fri) 23:12

テストデータを「生成する」プログラムも付けてくれるといいのだけど。
# テストデータ生成
dat = matrix(0, 300, 52)
colnames(dat) = c(LETTERS, letters)
set.seed(123)
idx = cbind(sample(300, 300*26, replace=TRUE),
sample(52, 300*26, replace=TRUE))
dat[idx] = sample(6, 300*26, replace=TRUE)
dat = data.frame(dat)
# 処理プログラム
names = colnames(dat)
fn = "out.txt"
if (file.exists(fn)) invisible(file.remove(fn))
invisible(apply(dat, 1, function(x) cat(rep(names, x), "\n", file=fn, append=TRUE)))
20倍くらいは速い。ただし,行末に1つ空白が付く。これを回避するには若干の追加処理が必要。

No.22017 【御礼】 Re: R 文字列の生成  【明石】 2016/05/28(Sat) 06:52

青木先生,
お忙しいところを失礼いたします,明石と申します。

ご丁寧なご教示をいただき,誠にありがとうございました。
また,助けていただきました。

投稿に際して,テストデータの件,不手際がございましたこと,お詫びいたします。

今後,投稿させていただく際には,お手を煩わせることが少なくなるように注意をいたします。

ご教示くださいました技は,あまりにも研ぎ澄まされていて,にわかには理解できませんので,
この土日,楽しみながら,じっくりと勉強させていただきます。

また,先生がお書きになられたように,確かに,体感的には数十倍の速度があります。

大変に良いお手本を示してくださり,心から御礼を申し上げます。
ありがとうございました。

● 「統計学関連なんでもあり」の過去ログ--- 048 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る