R子集函数,包括'['不适用于大数据帧/矩阵的中间范围

时间:2014-03-11 23:17:53

标签: r matrix dataframe subset

我遇到一个奇怪的问题,我在一个大数据帧上循环,从2列数据创建一个3D条形图,其中Z轴是频率。原始数据框看起来像这样(请原谅多余的列):

> head(MergedBH)
                   Row.names           V1.x            V2.x V3.x  V4.x V5.x
RFL_Contig1       RFL_Contig1    RFL_Contig1 Scaffold3494078 1.00 1.000  470
RFL_Contig100   RFL_Contig100  RFL_Contig100 Scaffold2661063 0.61 0.975  236
RFL_Contig1000 RFL_Contig1000 RFL_Contig1000  Scaffold861300 0.96 0.995  451
RFL_Contig1001 RFL_Contig1001 RFL_Contig1001 Scaffold4753307 0.67 0.982  568
RFL_Contig1002 RFL_Contig1002 RFL_Contig1002  Scaffold317096 1.00 0.996 1513
RFL_Contig1003 RFL_Contig1003 RFL_Contig1003   Scaffold60619 0.90 1.000  698
                     V1.y                  V2.y V3.y  V4.y V5.y
RFL_Contig1       RFL_Contig1 ta_contig_5DS_2768763 1.00 1.000  572
RFL_Contig100   RFL_Contig100  ta_contig_4DS_482537 0.56 0.966  737
RFL_Contig1000 RFL_Contig1000 ta_contig_2AL_5829507 0.83 0.944 1573
RFL_Contig1001 RFL_Contig1001 ta_contig_7BS_3161139 1.00 0.999  910
RFL_Contig1002 RFL_Contig1002 ta_contig_3B_10401908 1.00 0.997 2681
RFL_Contig1003 RFL_Contig1003 ta_contig_2AL_6424276 0.70 1.000 1004

我想创建一个3d条形图,其中x轴为$ V4.x,y轴为$ V4.y。我没有使用典型的hist2d函数,因为这么多的重量位于1,1位置,我们想要将该位置的重量可视化为其他位置。为此,我创建了一个3列矩阵,其中列1-2包含分别在V4.x和y范围内的所有成对组合(.8-1乘以.001),最后一列是频率。我用以下几行来做到这一点:

> for3d.mat <- matrix(ncol=3,nrow=0)
> for(i in seq(.8,1,by=.001)){for(j in seq(.8,1,by=.001)){iter.mat <- matrix(ncol=3,c(i,j,length(subset(MergedBH,MergedBH$V4.x==i & MergedBH$V4.y==j)$V4.x)));for3d.mat <- rbind(for3d.mat,iter.mat)}}
> subset(for3d.mat,for3d.mat[,1] == .975 & for3d.mat[,2] == .966)
 [,1] [,2] [,3]
> for3d.mat[35350:35325,]
   [,1]  [,2] [,3]
 [1,] 0.975 0.974    0
 [2,] 0.975 0.973    0
 [3,] 0.975 0.972    0
 [4,] 0.975 0.971    0
 [5,] 0.975 0.970    0
 [6,] 0.975 0.969    0
 [7,] 0.975 0.968    0
 [8,] 0.975 0.967    0
 [9,] 0.975 0.966    0
[10,] 0.975 0.965    0
[11,] 0.975 0.964    0
[12,] 0.975 0.963    0
[13,] 0.975 0.962    0
[14,] 0.975 0.961    0
[15,] 0.975 0.960    0
[16,] 0.975 0.959    0
[17,] 0.975 0.958    0
[18,] 0.975 0.957    0

当处理大矩阵时,不知道RFL_Contig100,.975,.966的值是否被子集拾取,当我找到正确的行时,它的频率值为0,但如果我接受在for循环中输出一行并运行它会产生正确的输入:

> matrix(ncol=3,c(i,j,length(subset(MergedBH,MergedBH$V4.x==i & MergedBH$V4.y==j)$V4.x)))
     [,1]  [,2] [,3]
[1,] 0.975 0.966    1

有关问题的任何建议?我已经尝试了几种不同的方法来做这个,但无法绕过子集函数,是否有另一种方法来计算每个bin的深度,以便用于3D条形图一次可视化所有点?

提前致谢

更新

在'['中遇到同样的问题,其中大部分矩阵在.92和.98之间没有得到处理:

> for3d.mat <- matrix(ncol=3,nrow=0)
> for(i in seq(.8,1,by=.001)){for(j in seq(.8,1,by=.001)){iter.mat <- matrix(ncol=3,c(i,j,length(MergedBH[MergedBH$V4.x ==i & MergedBH$V4.y ==j,]$V4.x)));for3d.mat <- rbind(for3d.mat,iter.mat)}}
> for3d.mat[for3d.mat[,1] == .975 & for3d.mat[,2] == .966,]
 [,1] [,2] [,3]

能够在大多数矩阵上使用'['或子集,但是对于原始数据帧或者无法通过子集化方法访问的for3d.mat,只有一个特定范围,例如:

> for3d.mat[for3d.mat[,1] == .976 & for3d.mat[,2] == .937,]
[1] 0.976 0.937    NA
> for3d.mat[for3d.mat[,1] == .975 & for3d.mat[,2] == .937,]
 [,1] [,2] [,3]

1 个答案:

答案 0 :(得分:2)

来自?subset

  

警告

     

这是一种便于交互使用的便利功能。对于   编程最好使用标准的子集函数   [,特别是论证子集的非标准评估   可能会产生意想不到的后果。

换句话说,在循环或[ - 样式函数内直接使用apply

我认为新subset包中的便捷功能有点像dplyr,如果[变得过于繁重,可能需要查看[with结合使用{{1}}使用{{1}}通常可以正常工作。