Entering edit mode
2.9 years ago
melissachua90
▴
70
I want to loop through all the values of the variable u
. It each loop iteration, I want to:
- Get the correct mapping between the ith transcript cluster ID and the exon probe IDs
- Subset the gene and exon matrices by the appropriate transcript cluster ID or exon probe IDs
- Call the exon.ni function
- Store the output p-values, test statistics, and CIs from this function for each transcript cluster ID (and exon probe IDs)
I also want only to conduct this calculation when I have at least 2 rows in the
d.exon
matrix.
My Code
# Exon ni value calculation and t-test function
exon.ni <- function(genex, exonx, r) {
ni <- t(t(exonx) -genex)
ttest <- t(apply(ni, 1, t.two, sam=as.logical(r), v=F))
return(ttest)
}
# Calculate ni p-values
ni.out <- for (i in u) {
ex <- dimnames(map[map$transcript_cluster_id %in% i,])[[1]]
d.exon <- as.numeric(unlist(e[ex,]))
d.gene <- as.numeric(unlist(g[i,]))
if(!is.null(d.exon) & nrow(d.exon) >= 2) {
exon.ni(genex=as.numeric(d.gene), exonx=d.exon, rx=r)
}
}
Traceback
Error in if (!is.null(d.exon) & nrow(d.exon) >= 2) { :
argument is of length zero
Data
> dput(map[1:3,])
structure(list(start = c("chr1", "chr1", "chr1"), stop = c(357616L,
358431L, 742655L), transcript_cluster_id = c(358324L, 358460L,
742719L), exon_id = c(2315251L, 2315251L, 2315373L), gene_assignment = c(90L,
90L, 163L), probeset_type = c("NM_001005224 // OR4F3 /// NM_001005221 // OR4F29 /// NM_001005504 // OR4F21 /// NM_001005277 // OR4F16 /// ENST00000333864 // OR4F3 /// ENST00000332831 // OR4F29",
"NM_001005221 // OR4F29 /// NM_001005277 // OR4F16 /// NM_001005224 // OR4F3 /// ENST00000333864 // OR4F3 /// ENST00000332831 // OR4F29",
"---"), X = c("main", "main", "main")), row.names = c(2315252L,
2315253L, 2315374L), class = "data.frame")
> dput(d.exon)
c(7.15477, 6.73452, 7.83324, 7.74893, 7.70502, 7.71924, 7.81656,
7.93411, 7.91731, 8.22131, 7.23939, 7.32724, 7.9622, 7.16362,
7.60169, 6.93187, 8.36692, 7.86296, 7.93925, 8.15436, 7.65065,
7.33006, 7.2545, 7.19284, 7.9268, 7.40626)
> dput(d.gene)
c(5.64052, 5.62837, 5.67166, 5.58459, 5.58858, 5.95862, 5.69327,
5.51709, 5.68322, 5.66781, 5.69987, 5.85948, 5.53388, 5.68834,
5.89737, 5.66356, 5.75942, 5.63467, 5.388, 5.70666, 5.56539,
5.79975, 6.16952, 5.77802, 5.63582, 5.84903
I don't know about all the rest, but your
nrow(d.exon) >= 2
is what's giving you a zero-length argument to the if statement. d.exon is a vector, not a matrix, so it has no rows, and you end up withNULL >= 2
which evaluates to a zero-length logical vector and crashes your if statement. Calling as.numeric just before that when creating d.exon is forcing it to be a vector (rather than whatever it would have been otherwise).Cross-posted at https://stackoverflow.com/q/70951832/680068