GGally包中的ggpairs似乎非常有用,但当数据集中存在NA时,它似乎失败了:
#require(GGally)
data(tips, package="reshape")
pm <- ggpairs(tips[,1:3]) #works just fine
#introduce NA
tips[1,1] <- NA
ggpairs(tips[,1:3])
> Error in if (lims[1] > lims[2]) { : missing value where TRUE/FALSE needed我没有看到任何处理NA值的文档,而且像ggpairs(tips[,1:3], na.rm=TRUE) (意料之中)这样的解决方案也不会更改错误消息。
我有一个数据集,其中可能有10%的值是NA,随机散布在整个数据集中。因此,na.omit(myDataSet)将删除大部分数据。有什么办法可以解决这个问题吗?
发布于 2012-10-27 09:02:03
GGally的一些功能,如ggparcoord(),支持通过missing=[exclude,mean,median,min10,random]参数处理NAs。然而,不幸的是,ggpairs()并非如此。
您可以做的是用您期望ggpair()自动为您做的数据的良好估计来替换NAs。有很好的解决方案,比如用row means、zeros、median甚至closest point替换它们(注意最近一句话中的4个超链接!)。
发布于 2014-01-20 18:42:29
我会用我自己可怕的变通方法来尝试一下,因为我认为这需要刺激。我同意OP的观点,即基于统计假设或选择的黑客来填写数据对于探索性分析来说是一个糟糕的想法,我认为一旦你忘记了它是如何工作的(对我来说大约五天),它肯定会失败,并且需要为其他东西调整它。
免责声明
这是一种可怕的做事方式,我讨厌它。当你有一个系统化的NAs来源时,它很有用,比如对高维数据集进行稀疏采样,这可能是OP所拥有的。
示例
假设你有一个非常大的数据集的一个很小的子集,使得你的一些列被稀疏地表示:
| 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进行绘图。现在,对于id列或其他列,返回到宽格式的规范dcast将不起作用,因为列范围是稀疏的(并且永远不会完全)表示:
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))这将使您返回到以通道为列的大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")现在可以使用上面的代码进行绘图了。
发布于 2014-07-02 02:03:05
据我所知,使用ggpairs()是无法解决这个问题的。此外,你没有填写“假”数据是完全正确的。如果这里的建议是合适的,我建议使用不同的绘图方法。例如
cor.data<- cor(data,use="pairwise.complete.obs") #data correlations ignoring pair-wise NA's
chart.Correlation(cor.data) #library(PerformanceAnalytics)或使用此处http://hlplab.wordpress.com/2012/03/20/correlation-plot-matrices-using-the-ellipse-library/中的代码
https://stackoverflow.com/questions/13093954
复制相似问题