我有一个gzip压缩文件file.gz
,包含4,726,276行,其中第一行和最后五行是这样的:
FID1 IID1 FID2 IID2 RT EZ Z0 Z1 Z2 PI_HAT PHE DST PPC RATIO
CAN -1 CAN 1 OT 0 1.0000 0.0000 0.0000 0.0000 -1 0.745118 0.1111 1.5526
CAN -1 CAN 2 OT 0 0.8761 0.1239 0.0000 0.0619 -1 0.752607 0.0648 1.4615
CAN -1 CAN 3 OT 0 0.8810 0.1190 0.0000 0.0595 -1 0.753934 0.3058 1.7941
CAN -1 CAN 4 OT 0 0.8911 0.1089 0.0000 0.0545 -1 0.751706 0.8031 2.4138
WAN 2 WAN 4 OT 0 0.8410 0.0000 0.1590 0.1590 -1 0.787251 0.0840 1.5000
WAN 2 WAN 5 OT 0 0.8606 0.0000 0.1394 0.1394 -1 0.784882 0.7671 2.3571
WAN 3 WAN 4 OT 0 0.8306 0.0000 0.1694 0.1694 -1 0.790142 0.0392 1.3846
WAN 3 WAN 5 OT 0 0.7960 0.0364 0.1676 0.1858 -1 0.795924 0.5000 2.0000
WAN 4 WAN 5 OT 0 0.8227 0.0090 0.1683 0.1728 -1 0.793460 0.5577 2.0645
x值是第1列+2。y值是第3 + 4列.z值是第10列。沿对角线的值不在输入文件中。它们最好是1,但0也可以。
如何根据此类数据创建热图?
以下是3x3矩阵的简单示例:
FID1 IID1 FID2 IID2 PI_HAT
A 1 B 1 0.1
A 1 B 2 0.2
B 1 B 2 0.3
答案 0 :(得分:2)
这是ggplot2
方法。在R中,4.5米行应该不是问题。
df <- read.table(text='FID1 IID1 FID2 IID2 RT EZ Z0 Z1 Z2 PI_HAT PHE DST PPC RATIO
CAN -1 CAN 1 OT 0 1.0000 0.0000 0.0000 0.0000 -1 0.745118 0.1111 1.5526
CAN -1 CAN 2 OT 0 0.8761 0.1239 0.0000 0.0619 -1 0.752607 0.0648 1.4615
CAN -1 CAN 3 OT 0 0.8810 0.1190 0.0000 0.0595 -1 0.753934 0.3058 1.7941
CAN -1 CAN 4 OT 0 0.8911 0.1089 0.0000 0.0545 -1 0.751706 0.8031 2.4138
CAN -1 CAN 4 OT 0 0.8911 0.1089 0.0000 0.0545 -1 0.751706 0.8031 2.4138
CAN -1 CAN 4 OT 0 0.8911 0.1089 0.0000 0.0545 -1 0.751706 0.8031 2.4138
WAN 3 WAN 4 OT 0 0.8306 0.0000 0.1694 0.1694 -1 0.790142 0.0392 1.3846
WAN 3 WAN 4 OT 0 0.8306 0.0000 0.1694 0.1694 -1 0.790142 0.0392 1.3846
WAN 2 WAN 4 OT 0 0.8410 0.0000 0.1590 0.1590 -1 0.787251 0.0840 1.5000
WAN 2 WAN 5 OT 0 0.8606 0.0000 0.1394 0.1394 -1 0.784882 0.7671 2.3571
WAN 3 WAN 4 OT 0 0.8306 0.0000 0.1694 0.1694 -1 0.790142 0.0392 1.3846
WAN 3 WAN 5 OT 0 0.7960 0.0364 0.1676 0.1858 -1 0.795924 0.5000 2.0000
WAN 4 WAN 5 OT 0 0.8227 0.0090 0.1683 0.1728 -1 0.793460 0.5577 2.0645', header=T)
我在输出中添加了几行,使其在热图中更合理。以前没有重叠:
#create your variables by merging columns 1+2 and 3+4
a <- mapply(paste,df[[1]], df[[2]])
b <- mapply(paste,df[[3]], df[[4]])
#combine in a data.frame
df2 <- data.frame(a,b)
library(dplyr)
#aggregate because you will need aggregated rows for this to work
#this should only take a few seconds for 4.5m rows
df3 <-
df2 %>%
group_by(a,b) %>%
summarize(total=n())
#plot with ggplot2
library(ggplot2)
ggplot(df3, aes(x=a,y=b,fill=total)) + geom_tile()
输出:
答案 1 :(得分:1)
您的问题似乎有两个部分:
乍一看,您似乎暗示数据的大小很大 - 有很多关于如何在R中使用大数据的资源(here's one) - 但是根据评论我认为数据大小实际上不是问题。如果是,那么您的选择将部分取决于您的硬件资源以及您愿意采样数据(我强烈推荐),而不是使用您的500万行中的每一行。 Central Limit Theorem是你的朋友。
您可以阅读gzip
这样的数据:
data <- read.table(gzfile("file.gz"),header=T, sep="\t", stringsAsFactors=F)
由于您没有提供压缩存档,我已经复制了您的示例数据,并在下面的代码中从剪贴板中读取它。我将向您展示如何根据这些数据构建热图;从gzip导入并处理大数据时,请查看上面提供的链接。
require(stats)
require(fields)
require(akima)
a <- read.table(con <- file("clipboard"), header = T)
a$x1 <- as.numeric(a[,1])
a$x2 <- as.numeric(a[,2])
a$y1 <- as.numeric(a[,3])
a$y2 <- as.numeric(a[,4])
x <- as.matrix(cbind(a$x1, a$x2))
y <- as.matrix(cbind(a$y1, a$y2))
z <- as.matrix(a[, 10])
s = smooth.2d(z, x=cbind(x,y), theta=0.5)
image.plot(s)