我真的需要帮助我的剧本,我不是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:如果有人试图在这里帮助我,但编译包有问题,我可以帮忙!也许我可以发送一个示例数据集(不确定我是否可以直接在这里附加任何内容)。
最诚挚的问候, 里克
答案 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]]