我遇到了一个奇怪的问题,我正在循环一个大数据帧,从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
结合通常工作得很好。