2017-06-04 89 views
0

我真的需要我的脚本帮助另一个列表的组合,我不是R.函数嵌套等级列表:比较数据列表针对与数据R

专业的什么我想要做一些背景资料。

有两个排名的数据列表(药物,疾病)。在这些数据集中有关于基因如何在表达中改变的信息。

药物RL(药物)数据集是一个数据集,它是一个排名列表。疾病RL(疾病)数据集是一个数据集,它在描述中表示它是相同的(?疾病RL),但似乎不是排名清单。

我所做的是我从疾病RL数据集中取出绝对数字,并使用数据范围(该数据集中特定疾病的矢量的最大 - 最小值)对数据进行归一化。

所以我现在有两个包含基因表达信息的数据框列表作为排名列表。

的某些代码示例,首先建立所需的软件包:

# Compile/install packages using biocLite. 
#source("https://bioconductor.org/biocLite.R") 
#biocLite("DrugVsDiseasedata") 
#biocLite("gespeR") 
#biocLite("DrugVsDisease") # may not be needed. 

然后导入包/数据集:

#import libraries 
library("DrugVsDisease")#may not be needed 
library("DrugVsDiseasedata") 
library("cMap2data") 
library("gespeR") 

#import datasets 
data(diseaseRL) 
data(drugRL) 


> class(drugRL) 
[1] "matrix" 
> 

> class(diseaseRL) 
[1] "matrix" 
> 


> str(drugRL) 
num [1:11709, 1:1309] 1870 4059 2250 10284 8999 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:11709] "ZNF702P" "SAMD4A" "VN1R1" "ZNF419" ... 
    ..$ : chr [1:1309] "(+)-chelidonine" "(+)-isoprenaline" "(+/-)-catechin" "(-)-MK-801" ... 
> 

> str(diseaseRL) 
num [1:11709, 1:45] 0.01683 -0.00112 -0.00126 0.04902 0.02605 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:11709] "LINC00115" "GOT2P1" "TP73-AS1" "PIN1P1" ... 
    ..$ : chr [1:45] "wilms-tumor" "glaucoma-open-angle" "diabetes-mellitus-type-ii" "soft-tissue-sarcoma" ... 
> 

既然说到这里我创建了一个功能正常化的数据集的一部分:

NormalizeRLData <- function(x){ 

data.rankedlist <- x 
data.rankedlist.abs <- as.data.frame(abs(data.rankedlist)) 
data.rankedlist.abs.ordered <- 
data.rankedlist.abs[order(data.rankedlist.abs,decreasing=T), , drop = FALSE] 

data.rankedlist.abs.ordered.max <- max(data.rankedlist.abs.ordered) 
data.rankedlist.abs.ordered.min <- min(data.rankedlist.abs.ordered) 

data.rankedlist.abs.ordered.normalizedToOwnRange <- (data.rankedlist.abs.ordered 
/
(data.rankedlist.abs.ordered.max - data.rankedlist.abs.ordered.min)) 

data.rankedlist.abs.ordered.normalizedToOwnRange.ordered <- 
data.rankedlist.abs.ordered.normalizedToOwnRange[order(
data.rankedlist.abs.ordered.normalizedToOwnRange,decreasing=T), , drop = 
FALSE] 

return(data.rankedlist.abs.ordered.normalizedToOwnRange.ordered) 
} 

diseaseRL.normalized <- apply(diseaseRL,2,NormalizeRLData) 
drugRL.normalized <- apply(drugRL,2,NormalizeRLData) 

我有很多疑问/问题,以便继续。我不确定我到目前为止所做的工作是否可以更有效地完成,特别是关于以下方面,使用等级偏向重叠(RBO)。

RBO是一种能够比较两个排名列表的功能。我想利用这个函数来处理标准化数据的列表,其中包含基因的数据框架(用于疾病和药物排名表)。这个rbo函数的输入是一个命名向量。

例如:

> a <- c(4,2,5,5) 
> b <- c(1,2,3,4) 
> names(a) <- c('one','two','three','four') 
> names(b) <- c('one','two','three','four') 
> rbo(a,b, p = 0.95) 
[1] 0.9650417 

什么是最有效的方式做到这一点,所以首先我能有更好的输出,那么我有什么,此刻提供给RBO的功能?

其次:

如果不是(或类似情况),我将有疾病含有醚的基因信息的药物data.frames的列表,和另一个。我想针对每种药物的每种药物进行rbo功能。

我尝试过使用sapply,但是我无法使它正常工作,而且我不确定它是否是正确的方法。我需要保持药物的名称,对于其他数据集名称的疾病,而且基因名称是重要的。因此,我可以稍后检查基因和疾病,药物正在发生相互作用。

我真的很希望这里有人能够对此有所了解!

p.s:如果有人试图帮助我,但在编译软件包时遇到问题,我可以帮忙!也许我可以发送一个示例数据集(不知道我是否可以直接在这里附加任何东西)。

最好的问候, 里克

回答

0

首先,用户定义的方法,可以大大地在冗长减少。无需投入data.frame,最初order,或使用分支[]中,因为载体正在传递到方法中。考虑下面的调整,其中最后一行是返回的对象:

NormalizeRLData <- function(x){ 
    rnklist <- abs(x) 
    rnklist <- rnklist[order(rnklist)] 

    normRng <- rnklist/(max(rnklist) - min(rnklist)) 
    normRng[order(normRng, decreasing = TRUE)] 
} 


diseaseRL.normalized <- apply(diseaseRL,2,NormalizeRLData) 
drugRL.normalized <- apply(drugRL,2,NormalizeRLData) 

其次,您的归一化矩阵(未dataframes)都不可能确实地与sapply通过使两个输入到该方法中,具体地两个数每列的运行矩阵作为参数。当两个向量在sapply中传递时,在两个集合之间的所有组合都被迭代的情况下应用笛卡尔积。

由于矩阵保持命名的列和行,因此它应该符合rbo的要求。返回将是矩阵M×N,其中维数是疾病药物矩阵的列数。

# TWO-INPUT SAPPLY 
rbo_mat <- sapply(seq(ncol(diseaseRL.normalized)), function(i,j) rbo(diseaseRL.normalized[,i], drugRL.normalized[,j], p = 0.95), 
        seq(ncol(drugRL.normalized))) 

# EQUIVALENT WITH VAPPLY TO [V]ERIFY TYPE AND LENGTH OF OUTPUT 
rbo_mat <- vapply(seq(ncol(diseaseRL.normalized)), function(i,j) rbo(diseaseRL.normalized[,i], drugRL.normalized[,j], p = 0.95), 
        numeric(seq(ncol(drugRL.normalized))), 
        seq(ncol(drugRL.normalized))) 

您甚至可以使用比较少为人知适用功能,rapply(递归适用):

cols_list <- list(seq(ncol(diseaseRL.normalized)), seq(ncol(drugRL.normalized))) 

rbo_mat2 <- rapply(cols_list, function(i,j) rbo(drugRL.normalized[,j], diseaseRL.normalized[,i], p = 0.95), 
        how="replace")[[1]] 

测试例

因为我无法重现OP的数据并没有必要的包,下面是上述方法的工作示例使用随机正常数据并使用相关函数cor作为rbo的替代品:

set.seed(142) 

mat1 <- sapply(1:10, function(i) rnorm(20)) 
colnames(mat1) <- LETTERS[1:10] 
rownames(mat1) <- letters[1:20] 

str(mat1) 
# num [1:20, 1:10] 1.255 1.704 0.88 -0.582 -0.169 ... 
# - attr(*, "dimnames")=List of 2 
# ..$ : chr [1:20] "a" "b" "c" "d" ... 
# ..$ : chr [1:10] "A" "B" "C" "D" ... 

mat2 <- sapply(1:5, function(i) rnorm(20)) 
colnames(mat2) <- LETTERS[1:5] 
rownames(mat2) <- letters[1:20] 

str(mat2)  
# num [1:20, 1:5] -0.156 0.449 -0.822 -1.062 0.838 ... 
# - attr(*, "dimnames")=List of 2 
# ..$ : chr [1:20] "a" "b" "c" "d" ... 
# ..$ : chr [1:5] "A" "B" "C" "D" ... 

corr_mat <- sapply(seq(ncol(mat1)), function(i,j) cor(mat1[,i], mat2[,j]), 
        seq(ncol(mat2))) 

corr_mat2 <- vapply(seq(ncol(mat1)), function(i,j) cor(mat1[,i], mat2[,j]), 
        numeric(ncol(mat2)), 
        seq(ncol(mat2))) 

corr_mat3 <- rapply(list(seq(ncol(mat1)), ncol(mat2)), function(i,j) cor(mat2[,j], mat1[,i]), 
        how="replace")[[1]]