嵌套排名列表中的函数:将数据列表与另一个列表与数据R

时间:2017-06-04 20:02:28

标签: r

我真的需要帮助我的剧本,我不是R的专业人士。

关于我想做什么的一些背景信息。

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

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

我所做的是从疾病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:如果有人试图在这里帮助我,但编译包有问题,我可以帮忙!也许我可以发送一个示例数据集(不确定我是否可以直接在这里附加任何内容)。

最诚挚的问候, 里克

1 个答案:

答案 0 :(得分:0)

首先,您的用户定义方法可以大大减少冗长。因为向量传递给方法,所以无需在data.frame中投射order,或在[]中使用 drop 。考虑以下调整,其中最后一行是返回的对象:

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)

其次,通过将两个输入传递给方法,特别是每个矩阵的列数作为参数,您的标准化矩阵(不是数据帧)可能确实可以与sapply一起运行。当在sapply中传递两个向量时,将应用笛卡尔积,其中迭代两个集之间的所有组合。

由于矩阵维护命名列和行,因此它应符合rbo要求。返回值为矩阵M x N,其中维度是 disease drug 矩阵的列数。

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

您甚至可以使用知名度较低的 apply 函数,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]]