これには刺激が必要だと思うので、私自身の恐ろしい回避策でそれを試してみます. 統計的仮定または選択されたハックに基づいてデータを入力することは探索的分析にとってひどい考えであるというOPに同意します.それは何か他のものです。
免責事項
これはひどいやり方で、私は嫌いです。おそらくOPが持っている高次元データセットのまばらなサンプリングのようなものから来るNAの体系的なソースがある場合に役立ちます。
例
非常に大きなデータセットの小さなサブセットがあり、一部の列がまばらに表現されているとします。
| Sample (0:350)| Channel(1:118)| Trial(1:10)| Voltage|Class (1:2)| Subject (1:3)|
|---------------:|---------------:|------------:|-----------:|:-----------|--------------:|
| 1| 1| 1| 0.17142245|1 | 1|
| 2| 2| 2| 0.27733185|2 | 2|
| 3| 1| 3| 0.33203066|1 | 3|
| 4| 2| 1| 0.09483775|2 | 1|
| 5| 1| 2| 0.79609409|1 | 2|
| 6| 2| 3| 0.85227987|2 | 3|
| 7| 1| 1| 0.52804960|1 | 1|
| 8| 2| 2| 0.50156096|2 | 2|
| 9| 1| 3| 0.30680522|1 | 3|
| 10| 2| 1| 0.11250801|2 | 1|
require(data.table) # needs the latest rForge version of data.table for dcast
sample.table <- data.table(Sample = seq_len(10), Channel = rep(1:2,length.out=10),
Trial = rep(1:3, length.out=10), Voltage = runif(10),
Class = as.factor(rep(1:2,length.out=10)),
Subject = rep(1:3, length.out=10))
例はばかげていますが、列がより大きなサブセットから均一にサンプリングされているふりをします。
でプロットするすべてのチャネルに沿ってデータをワイド フォーマットにキャストするとしますggpairs
。これで、列の範囲がまばらに (そして決して完全に) 表現されないため、標準的なdcast
ワイド形式に戻すことは、id
列またはそれ以外では機能しません。
wide.table <- dcast.data.table(sample.table, Sample ~ Channel,
value.var="Voltage",
drop=TRUE)
> wide.table
Sample 1 2
1: 1 0.1714224 NA
2: 2 NA 0.27733185
3: 3 0.3320307 NA
4: 4 NA 0.09483775
5: 5 0.7960941 NA
6: 6 NA 0.85227987
7: 7 0.5280496 NA
8: 8 NA 0.50156096
9: 9 0.3068052 NA
10: 10 NA 0.11250801
この場合id
、おもちゃの例なのでどの列が機能するかは明らかですsample.table[,index:=seq_len(nrow(sample.table)/2)]
が ( )、巨大な data.table の小さな均一なサンプルの場合、id
データのすべての穴を通過する一連の値を見つけることは基本的に不可能です。式の引数に適用された場合。このクラッジは機能します:
setkey(sample.table,Class)
順序が固定されていることを確認するために、最後にこれが必要になります。
chan.split <- split(sample.table,sample.table$Channel)
これにより、一意のチャネルごとに data.frames のリストが取得されます。
cut.fringes <- min(sapply(chan.split,function(x) nrow(x)))
chan.dt <- cbind(lapply(chan.split, function(x){
x[1:cut.fringes,]$Voltage}))
各 data.frame の行数が同じであることを確認するためのより良い方法が必要ですが、私のアプリケーションでは、それらが数行だけ異なることを保証できるので、余分な行を削除するだけです。
chan.dt <- as.data.table(matrix(unlist(chan.dt),
ncol = length(unique(sample.table$Channel)),
byrow=TRUE))
これにより、チャネルが列として含まれる big data.table に戻ります。
chan.dt[,Class:=
as.factor(rep(0:1,each=sampling.factor/2*nrow(original.table)/ncol(chan.dt))[1:cut.fringes])]
最後に、カテゴリ変数を再度バインドします。これが一致するように、テーブルは既にカテゴリ別にソートされている必要があります。これは、すべてのデータを含む元のテーブルがあることを前提としています。他にも方法があります。
ggpairs(data=chan.dt,
columns=1:length(unique(sample.table$Channel)), colour="Class",axisLabels="show")
これで、上記でプロット可能になりました。