2

多くの異なる行を含むデータ ファイルを読み込んでいます。すべての行は次のように長さが異なる場合があります。

dataFile <- read.table("file.txt", as.is=TRUE);

行は次のようになります。

1 5 2 6 2 1
2 6 24
2 6 1 5 2 7 982 24 6
25 2

行を列に変換する必要があります。次に、バイオリン プロットの列を次のように使用します。

names(dataCol)[1] <- "x";
jpeg("violinplot.jpg", width = 1000, height = 1000);
do.call(vioplot,c(dataCol,))
dev.off()

最大エントリ数の列よりもエントリ数が少ない列には、空の文字列/プレースホルダーがあると想定しています。どうすればそれができますか?

4

2 に答える 2

0

編集:どうやらオプションread.tablefill=TRUEあり、これは私の答えよりもずっと簡単です。

これまでに vioplot を使用したことがなく、( のようなものではなくvioplot(dataCol)) 関数呼び出しを行う奇妙な方法のように思えますが、以前に不規則な配列を扱ったことがあるので、それを試してみます。

もうデータを読みましたか?それは最も難しい部分になる傾向があります。以下のコードは、上記のデータを、呼び出されたファイルから、呼び出さtemp.txtれたマトリックスに読み取ります。out2

file = 'temp.txt'
dat = readChar(file,file.info(file)$size)
split1 = strsplit(dat,"\n")
split2 = strsplit(split1[[1]]," ")
n = max(unlist(lapply(split2,length)))
out=matrix(nrow=n,ncol=length(split2))
tFun = function(i){
    vect = as.numeric(split2[[i]])
    length(vect)=n
    out[,i]=vect
}
out2 = sapply(1:length(split2),tFun)

私が行ったことを説明しようとします。最初のステップは、 を介してすべての文字を読み込むことreadCharです。次に、行を分割し、各行内の要素を分割して list を取得しますsplit2。ここで、リストの各要素は入力ファイルの行です。

そこから、データに適したサイズの空の行列を作成し、リストを反復して各要素を列に割り当てます。

それはきれいではありませんが、うまくいきます!

于 2013-07-17T21:52:51.363 に答える