####################################################################
## Author: Gro Nilsen, Knut Liestøl and Ole Christian Lingjærde.
## Maintainer: Gro Nilsen <gronilse@ifi.uio.no>
## License: Artistic 2.0
## Part of the copynumber package
## Reference: Nilsen and Liestøl et al. (2012), BMC Genomics
####################################################################
#Get a subset of segments for given chromosomes and/or sampleIDs
##Input:
### segments : either a data frame or the name of a file containing the segments found by either pcf, multipcf or aspcf
### chrom : a numeric vector with chromosome number(s) for which data or segments should be selected. If unspecified, all chromosomes in data or segments will be selected
### sample : a numeric vector indicating which sample(s) is to selected. The number(s) should correspond to the sample's place (in order of appearance) in the data
### sep : the separator of the input files if \code{data} is a file. Default is "\t"
### ... : optional parameters to be passed to \code{read.table} in the case where data are to be read from files
## Output:
### sel.segments : the data frame with segments selected on chromosomes and sampleIds
##Required by:
### none
##Requires:
### is.multiseg
### numericChrom
### pullOutContent
subsetSegments <- function(segments,chrom=NULL,sample=NULL,sep="\t",...){
#Check if segments is a file:
isfile <- class(segments)=="character"
#get header and chrom from data
if(isfile){
#read segment-file
segments <- read.table(segments,header=TRUE,sep=sep,as.is=TRUE)
}else{
#Make sure segments is a data frame
segments <- pullOutContent(res=segments,what="segments")
}
#Check whether we have multiPCF segments:
multi <- is.multiseg(segments)
if(multi){
seg.sampleid <- colnames(segments)[-c(1:5)]
seg.chrom <- segments[,1]
}else{
seg.sampleid <- segments[,1]
seg.chrom <- segments[,2]
}
#make sure chrom in segments are numeric
seg.chrom <- numericChrom(seg.chrom)
#Pick out relevant chromosomes:
keepchrom <- 1:length(seg.chrom)
if(!is.null(chrom)){
#make sure selected chrom are numeric:
chrom <- numericChrom(chrom)
#Check that these chrom are found in data.chrom
use <- chrom%in%unique(seg.chrom)
use.chrom <- chrom[use]
if(length(use.chrom)==0){
msg <- "None of the specified chromosomes are found in segments"
stop(msg,call.=FALSE)
}else if(length(use.chrom)!=length(chrom)){
not.use <- paste(chrom[!use],sep="",collapse=",")
msg <- paste("The following chromosome(s) are not found in segments:",not.use,sep=" ")
warning(msg,call.=FALSE,immediate.=TRUE)
}
keepchrom <- which(seg.chrom%in%use.chrom)
}
#Select segments for the desired chromosome number:
sel.segments <- segments[keepchrom,,drop=FALSE]
#Check that specified sampleIDs are found in segments:
if(!is.null(sample)){
#Get sampleID for selected samples:
id <- as.character(unique(seg.sampleid))
sampleID <- id[sample]
if(any(is.na(sampleID))){
stop("Input in 'sample' is outside the number of samples represented in segments",.call=FALSE)
}
#selct segments for this sampleID(s)
if(multi){
keepsample <- which(colnames(segments)%in%sampleID)
sel.segments <- sel.segments[,c(1:5,keepsample)]
colnames(sel.segments) <- c(colnames(segments)[1:5],colnames(segments)[keepsample])
}else{
keepsample <- which(sel.segments[,1]%in%sampleID)
sel.segments <- sel.segments[keepsample,,drop=FALSE]
}
}
return(sel.segments)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.