Преобразовать фрейм данных в матрицу со счетчиками

У меня есть файлы данных, структурированные следующим образом:

OTU1    PIA0    1120
OTU2    PIA1    2
OTU2    PIA3    6
OTU2    PIA4    10
OTU2    PIA5    1078
OTU2    PIN1    24
OTU2    PIN2    45
OTU2    PIN3    261
OTU2    PIN4    102
OTU3    PIA0    16
OTU3    PIA1    59
OTU3    PIA2    27
OTU3    PIA3    180
OTU3    PIA4    200
OTU3    PIA5    251
OTU3    PIN0    36
OTU3    PIN1    61
OTU3    PIN2    156
OTU3    PIN3    590
OTU3    PIN4    277
OTU4    PIA0    401
OTU4    PIN0    2

И я хочу создать матрицу, которая показывает комбинацию данных из второго столбца, принимая первый столбец в качестве ссылки для подсчетов комбинации (показывая, сколько раз измеряется каждый по номеру первого столбца -OTU1, OTU2, OTU3, OTU4- все данные из второго столбца появляются вместе друг с другом в одной OTU). Это должно выглядеть так:

    PIA0  PIA1  PIA2  PIA3  PIA4  PIA5  PIN0  PIN1  PIN2  PIN3  PIN4
PIA0  1     1     1     1     1     1     2     1     1     1     1 
PIA1  1     0     1     2     2     2     1     2     2     2     2
PIA2  1     1     0     1     1     1     1     1     1     1     1
PIA3  1     2     1     0     2     2     1     2     2     2     2
PIA4  1     2     1     2     0     2     1     2     2     2     2
PIA5  1     2     1     2     2     0     1     2     2     2     2
PIN0  2     1     1     1     1     1     0     1     1     1     1
PIN1  1     2     1     2     2     2     1     0     2     2     2
PIN2  1     2     1     2     2     2     1     2     0     2     2
PIN3  1     2     1     2     2     2     1     2     2     0     2
PIN4  1     2     1     2     2     2     1     2     2     2     0

Данные, совместно используемые строкой и столбцом с тем же именем, отражают количество раз, когда этот элемент данных появляется отдельно в OTU.

Любые идеи?

Я читал о библиотеках R reshape2 и команде acast здесь, но с этим я могу только изменить форму матрицы со всеми данными в ней, а не производить подсчет комбинаций по желанию. Я также думал о скрипте Biopython, но я думаю, что он был бы слишком большим и сложным для написания его с моими небольшими знаниями о программировании.

Цель состоит в том, чтобы построить матрицу, подобную той, которая приведена в примере, чтобы я мог запускать CIRCOS онлайн программа с этими данными.


person Ma_fermar    schedule 21.08.2013    source источник
comment
Я попытался последовать вашему объяснению и не вижу связи между вашими данными - можете ли вы опубликовать упрощенный пример?   -  person alexwhan    schedule 21.08.2013
comment
Что я хочу сделать, так это написать число, которое отражает, сколько раз каждая точка данных во втором столбце встречается друг с другом в пределах одной OTU. Я имею в виду, например, что «PIA0» появляется в 3 «OTU» (первый столбец, OTU1, OTU3 и OTU4), тогда как «PIN0» появляется только в 2 (OTU3 и OTU4). Поскольку «PIA0» и «PIN0» появляются в OTU3 и OTU4, число в итоговой таблице, где они пересекаются, должно быть 2.   -  person Ma_fermar    schedule 21.08.2013


Ответы (1)


Вы можете использовать dcast, чтобы создать двоичную матрицу, указывающую на присутствие каждого PI внутри каждого OTU, а затем умножить ее на себя, чтобы получить подсчеты.

d <- read.fwf( textConnection("
OTU1    PIA0    1120
OTU2    PIA1    2
OTU2    PIA3    6
OTU2    PIA4    10
OTU2    PIA5    1078
OTU2    PIN1    24
OTU2    PIN2    45
OTU2    PIN3    261
OTU2    PIN4    102
OTU3    PIA0    16
OTU3    PIA1    59
OTU3    PIA2    27
OTU3    PIA3    180
OTU3    PIA4    200
OTU3    PIA5    251
OTU3    PIN0    36
OTU3    PIN1    61
OTU3    PIN2    156
OTU3    PIN3    590
OTU3    PIN4    277
OTU4    PIA0    401
OTU4    PIN0    2"), widths=c(8,8,10), header=FALSE, skip=1 )

library(reshape2)
A <- as.matrix( dcast( V1 ~ V2, data=d, length )[,-1]>0 )
#          PIA0     PIA1     PIA2     PIA3     PIA4     PIA5     PIN0     PIN1     PIN2     PIN3     PIN4    
# [1,]     TRUE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE    FALSE
# [2,]    FALSE     TRUE    FALSE     TRUE     TRUE     TRUE    FALSE     TRUE     TRUE     TRUE     TRUE
# [3,]     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE     TRUE
# [4,]     TRUE    FALSE    FALSE    FALSE    FALSE    FALSE     TRUE    FALSE    FALSE    FALSE    FALSE
t(A) %*% A
#              PIA0     PIA1     PIA2     PIA3     PIA4     PIA5     PIN0     PIN1     PIN2     PIN3     PIN4    
# PIA0            3        1        1        1        1        1        2        1        1        1        1
# PIA1            1        2        1        2        2        2        1        2        2        2        2
# PIA2            1        1        1        1        1        1        1        1        1        1        1
# PIA3            1        2        1        2        2        2        1        2        2        2        2
# PIA4            1        2        1        2        2        2        1        2        2        2        2
# PIA5            1        2        1        2        2        2        1        2        2        2        2
# PIN0            2        1        1        1        1        1        2        1        1        1        1
# PIN1            1        2        1        2        2        2        1        2        2        2        2
# PIN2            1        2        1        2        2        2        1        2        2        2        2
# PIN3            1        2        1        2        2        2        1        2        2        2        2
# PIN4            1        2        1        2        2        2        1        2        2        2        2
person Vincent Zoonekynd    schedule 21.08.2013
comment
Большое спасибо, я думаю, это то, что мы искали. Однако, как я уже сказал, я новичок в «R», поэтому у меня много вопросов: что означает «widths = c (8,8,10)»? И '[, -1] ›0'? Еще раз спасибо. - person Ma_fermar; 21.08.2013
comment
width=c(8,8,10) - это просто аргумент read.fwf, который я использовал для создания data.frame: поскольку у вас уже есть data.frame, он вам не нужен. [,-1] удаляет первый столбец (он содержал MTU). >0 преобразует счетчики (результат length) в логические значения. Вы можете сравнить dcast(V1 ~ V2, data=d) с dcast(V1 ~ V2, data=d)[,-1]) или dcast(V1 ~ V2, data=d, length). - person Vincent Zoonekynd; 21.08.2013
comment
Большое спасибо, это сработало очень хорошо. Еще один вопрос: есть ли способ узнать, сколько раз каждый столбец в результате (PIA0, PIA1, PIA2 ...) имел аргумент = 'ИСТИНА', в то время как все остальные столбцы имели значение 'ЛОЖЬ' (число раз, когда каждый столбец появляется как уникальный компонент OTU в исходном фрейме данных) ?? Еще раз спасибо - person Ma_fermar; 22.08.2013
comment
Определите строки u, содержащие только один элемент (sum(u)==1), и подсчитайте: rowSums( apply(A, 1, function(u) u & sum(u) == 1 ) ). - person Vincent Zoonekynd; 22.08.2013
comment
Здорово!!! Это именно то, что мне было интересно, возможно ли это сделать !!! Большое спасибо, ваша помощь была действительно полезной. - person Ma_fermar; 22.08.2013