我遇到一个奇怪的问题,我在一个大数据帧上循环,从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]
答案 0 :(得分:2)
来自?subset
:
警告强>
这是一种便于交互使用的便利功能。对于 编程最好使用标准的子集函数 [,特别是论证子集的非标准评估 可能会产生意想不到的后果。
换句话说,在循环或[
- 样式函数内直接使用apply
。
我认为新subset
包中的便捷功能有点像dplyr
,如果[
变得过于繁重,可能需要查看[
,with
结合使用{{1}}使用{{1}}通常可以正常工作。