我会用我自己可怕的解决方法来尝试它,因为我认为这需要刺激。我同意 OP 的观点,即基于统计假设或选择的 hack 填充数据对于探索性分析来说是一个糟糕的主意,我认为一旦你忘记它是如何工作的(对我来说大约五天)并且需要调整,它肯定会失败它是为了别的东西。
免责声明
这是一种糟糕的做事方式,我讨厌它。当您有来自高维数据集的稀疏采样(可能是 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)]
(id
当应用于公式参数时。这个kludge将起作用:
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))
这将使您回到一个大数据表,其中以 Channels 作为列。
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")
现在它可以用上面的方法绘制了。