2014-10-29 4 views
2

У меня есть два списка, list1 и list2. Первая состоит из значений кластеров и последней из кластеров pvalues. Элементы в каждом списке строго связаны, например, list1[[1]] имеет 13 номеров, а list2[[1]] имеет 13 значений, соответствующих каждому значению в list1. Затем у меня есть еще один список: list3, с определенным количеством pvalues ​​(в моем реальном случае есть не менее 100), классифицированных по номерам в list1, то есть list3['1'] будет иметь все pvalues ​​от list2, что соответствует значению 1. Вот несколько примеров объектов, чтобы прояснить вопрос.создать список матриц, где столбцы являются перестановками на основе списка

list1 
# $cluster.1 
# [1] 1 2 12 58 31 41 44 24 
# 
# $cluster.2 
# [1] 6 56 46 44 
# 
# $cluster.3 
# [1] 1 63 74 4 12 
# 
# $cluster.4 
# [1] 49 112 9 34 4 76 48 18 20 64 
# 
# $cluster.5 
# [1] 14 22 63 47 36 6 40 7 2 4 90 16 20 15 14 18 76 35 
# 
# $cluster.6 
# [1] 1 9 1 8 2 2 51 36 3 212 33 12 88 23 

list2 
# $cluster.1 
# [1] 0.6591487 0.8994453 0.1538042 0.6964092 0.8401874 0.3814041 0.4633218 
# [8] 0.7244993 
# 
# $cluster.2 
# [1] 0.8497138 0.5865632 0.1077595 0.6833493 
# 
# $cluster.3 
# [1] 0.3361554 0.6120117 0.0981049 0.5463973 0.3299392 
# 
# $cluster.4 
# [1] 0.66537320 0.92404972 0.03616409 0.20704537 0.40120409 0.68727494 
# [7] 0.60326315 0.08871090 0.71780273 0.09714994 
# 
# $cluster.5 
# [1] 0.5926167 0.4155177 0.5230090 0.3620749 0.8698867 0.2490805 0.2775648 
# [8] 0.1876079 0.5346257 0.6736455 0.3626760 0.8941776 0.4278336 0.7944475 
# [15] 0.6687182 0.0171974 0.2931373 0.3987727 
# 
# $cluster.6 
# [1] 0.3222530 0.1097813 0.3014139 0.9999900 0.5232969 0.4544731 0.4342567 
# [8] 0.9999900 0.5435826 0.1937477 0.1713069 0.7474790 0.1683223 0.8814443 

list3[1:2] 
# $`1` 
# [1] 0.2977049 0.3080035 0.3445133 0.2938342 0.3630210 0.3037416 0.2841442 
# [8] 0.2777617 0.3366143 0.3121525 0.2460582 0.3229141 0.3283752 0.4038269 
# [15] 0.3220467 0.3059212 0.2960296 0.3747395 0.3228451 0.2894994 0.3609505 
# [22] 0.3447814 0.2993272 0.3088115 0.3255970 
# 
# $`2` 
# [1] 0.21775479 0.98620413 0.25035841 0.31131319 0.48057769 0.98633571 
# [7] 0.20208590 0.39117415 0.55579118 0.23737710 0.37548844 0.20139280 
# [13] 0.49689904 0.34500830 0.19796570 0.45113871 0.20210998 0.51241253 
# [19] 0.49254870 0.50922946 0.20125218 0.21230656 0.23612062 0.13508699 
# [25] 0.48944306 

The list3 основан на двух предыдущих списках, то есть, первый элемент list1 это число, связанное с p-значение первого элемента list2. Поэтому list3 включает в себя все pvalues, соответствующие одному номеру, например, все pvalues ​​для номера 2. До сих пор меня интересовало построение списка матриц, в которых элементы list1 были заменены на выборки элементов из list3 с тем же номером. Моя команда, чтобы сделать это было:

list4 <- lapply(list1, function(x) sapply(x, function(i, l) 
    sample(l[[as.character(i)]], 10, replace=T), l=list3)) 

И эта команда дала мне этот вид продукции

list4[[2]] 
#   [,1]  [,2]  [,3]  [,4] 
# [1,] 0.7983852 0.29404183 0.2416229 0.3018420 
# [2,] 0.7398054 0.41266109 0.9253389 0.3249007 
# [3,] 0.1150981 0.24138907 0.4040050 0.8335943 
# [4,] 0.4564887 0.28336511 0.2520307 0.5460348 
# [5,] 0.2810911 0.92870457 0.6865136 0.4851188 
# [6,] 0.6396584 0.68957506 0.8336891 0.1355544 
# [7,] 0.3365557 0.01609222 0.2504679 0.1974983 
# [8,] 0.2307067 0.99999000 0.8328432 0.6538944 
# [9,] 0.9999900 0.84980684 0.5590235 0.2566799 
# [10,] 0.5791690 0.27672559 0.3584696 0.8335943 

Однако, теперь я хочу, чтобы построить перестановки для каждого кластера, но избегая пробовать pvalues ​​о том, что кластер в list3. Таким образом, и в качестве примера, для list1['cluster.1] я хотел бы удалить из list3 значения paleues от list2['cluster.1'] и то же самое для остальных кластеров в list1.

Любая помощь будет очень признательна.

Большое спасибо

UPDATE,

После комментариев я обновлю процесс, чтобы получить эти списки и окончательный вывод желания. Эти списки приходят из data.frame с ~ 17000 строк и 3 столбцов, и пример выглядит следующим образом:

head(pvals) 
# gene  pval mac 
#1 A1CF 0.896076585 26 
#2 ABCC2 0.376808322 571 
#3 ABI1 0.048601644 27 
#4 ABLIM1 0.729589080 63 
#5 ACADSB 0.001609905 50 
#6 ACBD5 0.446628090 11 

list3 происходит от разделения на колонке макинтош в pvals data.frame:

split.mac = split(pvals, pvals[,3]) 
mac.pval = lapply(split.mac, '[[', 2) 
pvals.order <- pvals[order(pvals$mac),] 

Затем сгенерировать список, содержащий каждый элемент, по меньшей мере 100 генов

l3 <- list() 
ll1 <- length(mac.pval) 
length(l3) <- ll1 
set.seed(4) 
for (i in 1:ll1) { 
    vec1 <- mac.pval[[i]] 
    jl <- 1; jr <- 1; 
    while (length(vec1) < 100) { 
    if(i==1 || i-jl==0) { 
     vec1 <- c(vec1, mac.pval[[i+jr]]) 
     jr <- jr+1 
    } else if (i==ll1 || jr+i==ll1) { 
     vec1 <- c(vec1, mac.pval[[i-jl]]) 
     jl <- jl+1 
    } else { 
     vec1 <- c(vec1, mac.pval[[i-jl]], mac.pval[[i+jr]]) 
     jl <- jl+1 
     jr <- jr+1 
    } 
    } 
    l3[[i]] <- vec1 
} 

names(l3) <- names(mac.pval) 
list3 <- l3 

clusters <- strsplit(readLines("clusters.txt"), "\t") # the output is a list with gene names 

Затем list1 и «песни2 are generated matching the pvalues` data.frame

list2 <- lapply(clusters, function(x) { 
    pvals[match(as.character(unlist(x)), as.character(pvals[[1]])), 2] 
}) # the output is a list with the `mac` column of `pvals` 

list1 <- lapply(clusters, function(x) { 
    pvals[match(as.character(unlist(x)), as.character(pvals[[1]])), 3] 
}) # the output is a list with the `pval` column of `pvals` 

Наконец, используя list3 и list1 я получить список (list4) с числом перестановок быть строками и столбцами количества элементов в этом кластере. До сих пор меня интересовала выборка во всей группе генов с тем же mac, но теперь я хотел бы удалить из каждого из выборок значения p, соответствующие в кластере для этой выборки. Функция я использовал для перестановки такова:

list4 <- lapply(list1, function(x) sapply(x, function(i, l) { 
    sample(l[[as.character(i)]], 10, replace=T) 
}, l=list3)) 

Надежда это обновление поможет получить ответ,

спасибо

+1

Можете ли вы 'dput()' ваши списки и, возможно, расширить свое описание желаемого результата? – vpipkt

+0

На @vpipkt вы можете опубликовать процесс, который сгенерировал эти списки – miles2know

+0

Мои данные @vpipkt очень велики, список1 представляет собой список 2418 с числовой переменной элементов (min = 3 max = 147), а в моем случае list4 должен быть списком данных с 10 000 строк и так много столбцов как элементов в его соответствующих списках1 и 2, т. е. если list1 [[2]] имеет 4 элемента list3 [[1]] будет иметь тусклый 10 000 строк и 4 столбца – user2380782

ответ

0

То, что вы хотите, может быть, не так уж сложно - что трудно пробираться сквозь ваше длинное и запутанное объяснение. Будет ли это работать?

list4 <- lapply(list1, 
    function(x) sapply(x, function(i) { 
    sample_from <- setdiff(list3[[as.character(i)]], list1[[as.character(i)]]) 
    sample(sample_from, 10, replace=T) 
})) 

В общем, вы, вероятно, ошибетесь. Например, зачем создавать списки 1 и 2? У вас уже есть данные в вашем фрейме данных, поэтому работайте там. Я думаю, что вы хотите сделать это от list3 за каждое уникальное значение list1. И list3 - это куча блюд. Поэтому я предполагаю, что вы хотите сделать что-то гораздо более простое:

list4 <- list() 
for (mac in unique(pvals$mac)) { 
    list4[[mac]] <- sample(pvals$pval[pvals$mac==m], 100, replace=FALSE)  
} 
+0

Это не то, что я ищу, но я буду награждать вас в любом случае – user2380782

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