2014-10-29 92 views
2

我有兩個列表,list1list2。前者由簇值組成,後者由簇值組成。每個列表中的元素都是嚴格相關的,例如list1[[1]]有13個數字,而list2[[1]]有13個對應於list1中每個值的pvalues。然後,我有另一個列表list3,根據list1中的數字對一定數量的pvalues(在我的實際情況下至少有100個)進行分類,即list3['1']將具有對應於值1list2的所有pvalues。這裏是一些對象的例子,以澄清問題。創建一個矩陣列表,其中列是基於列表的排列

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 

list3是基於前兩個列表,即,的list1第一元件是具有list2第一元件的p值相關聯的數字。因此,list3包括對應於相同編號的所有pvalues,例如編號爲2的所有pvalues。直到現在,我有興趣構建一個矩陣列表,其中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 

不過,現在我想建立每個羣集的排列,但避免品嚐的p值集羣在list3。因此,作爲示例,對於list1['cluster.1],我想從list3中刪除list2['cluster.1']中的pvalues,對於list1中的其餘集羣也是如此。

任何幫助將不勝感激。

非常感謝

UPDATE,

發表意見之後我會更新過程中得到這些名單和最後的願望輸出。這些列表來自同〜17000行3列的data.frame,和示例如下:

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來自柱MAC的分裂在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和「list2中列表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` 

最後,使用list3list1我獲得具有排列爲行和列的該羣集中的元素數的數的列表(list4)。到目前爲止,我對整個基因組採樣的興趣相同,但是現在我想從每個採樣中去除該採樣的集羣對應的p值。 我已經用於置換的功能是這樣的:

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

希望本次更新的幫助得到答案,

非常感謝

+1

你可以'輸入()'你的列表,也許擴展你的描述你想要的結果嗎? – vpipkt 2014-10-31 14:46:17

+0

On @vpipkt您可以發佈生成這些列表的過程 – miles2know 2014-11-01 00:06:48

+0

我的數據@vpipkt非常龐大,list1是一個2418列表,其中包含元素數量變量(min = 3 max = 147),在我的情況下,list4必須是列表1和列2中的元素數量爲10,000行和列的數據幀的列表,即,如果list1 [[2]]具有4個元素,list3 [[1]]將具有10,000行和4列的暗淡度 – user2380782 2014-11-01 21:00:47

回答

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是一堆pvals。所以我的猜測是你想做一些簡單的事情,比如:

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

這不是我想要的,但我仍然會獎勵你 – user2380782 2014-11-07 14:43:37