2015-05-01 2 views
1

У меня есть GZIP сжатый файл file.gz с 4,726,276 строк, где первые и последние пять строк выглядят следующим образом:Создание тепла карта с R от квадратной матрицы

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 

Рентгеновское значение является столбец 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

колонка 1 FID1, как вы добавляете CAN и -1? – rawr

+0

@rawr Я добавляю их как строки. 'CAN' + '-1' = 'CAN-1' –

ответ

2

Это ggplot2 подход. 4,5 м строка не должна быть проблемой в R.

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() 

Выход:

enter image description here

+0

Обычно я не использую R. Где вы определяете переменную df? –

+0

4,5 миллиона строк были бы проблемой в R, но, к счастью, он не имел в виду, что его данные имеют 4,5 миллиона строк. –

+0

@ tommy.carstensen первая строка моего кода. функция read.table присваивает ваши данные переменной 'df'. В R вы не определяете переменные явно. – LyzandeR

1

Ваш вопрос, кажется, есть 2-х частей:

  1. Как обрабатывать данные в R (в данном случае, поступающие из Gzip сжатый архив)
  2. Как сделать Heatmap

на первый взгляд, казалось, что мы вас re подразумевая, что размер данных был большим - есть много ресурсов о том, как использовать Big Data в R (here's one) - однако на основе комментариев я полагаю, что размер данных на самом деле не является проблемой. Если бы это было тогда, ваши варианты зависели бы частично от ваших аппаратных ресурсов, а также от желания готовить данные (которые я настоятельно рекомендую), а не использовать каждую из ваших 5 миллионов строк. Central Limit Theorem - твой друг.

Вы можете прочитать в gzip данных, как это:

data <- read.table(gzfile("file.gz"),header=T, sep="\t", stringsAsFactors=F) 

Поскольку вы не предоставили свой сжатый архив, я скопировал данные образцы и прочитать его из моего буфера в коде ниже. Я покажу вам, как построить тепловую карту из этих данных; для импорта из gzip и обработки Big Data ознакомьтесь с приведенной выше ссылкой.

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) 

enter image description here

+0

Спасибо. Это, однако, не большие данные. Файл содержит всего несколько миллионов строк, а матрица - всего несколько тысяч строк и столбцов. –

+0

Ваше использование термина «строки» в отличие от «строк» ​​немного неясно, но если данные не большие, то это должно быть все проще, нет? –

+0

По строкам я подразумеваю строки во входном файле. По строкам я имею в виду строки в матрице и тепловую карту. Обычно я не использую R (я делаю gnuplot и matplotlib), поэтому мне это нелегко. –

Смежные вопросы