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



我遇到了一个奇怪的问题,我正在循环一个大数据帧,从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 by .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_cong100,. 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条形图来一次可视化所有点?

Thanks in advance

更新:

得到与'['相同的问题,其中矩阵的很大一部分,在。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,都只有一个特定的范围。

:
> 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]

From ?subset:

这是一个用于交互使用的方便函数。为编程时最好使用标准的子集函数,比如,特别是参数子集的非标准求值会产生意想不到的后果。

换句话说,在循环或apply风格的函数中直接使用[

我认为在新的dplyr包中有一个类似subset的方便函数,如果[变得过于繁重,您可能想要查看一下,但是[with结合通常工作得很好。

最新更新