当观测矩阵中的一个变量存在多个观测值时,在R中为每个变量选取变量最多的观测值

当观测矩阵中的一个变量存在多个观测值时,在R中为每个变量选取变量最多的观测值,r,filtering,R,Filtering,我有一个如下格式的数据框,正如您所看到的,每个基因都有多个相关变量(例如,前两行都与基因X1相关) 如何为X1选择变量最大的探针,为X2选择变量最大的探针,为X3选择变量最大的探针?我将使用每行的中位数绝对偏差来计算可变性,从而为我提供可变性的度量。数据帧的尺寸相当大(439385 x 32) 编辑 我用这个函数计算了中位数绝对偏差,是的 dataframe$MAD<-apply(dataframe,1,mads) dataframe$MAD正如罗纳德在评论中所说的,您应该更具体地告

我有一个如下格式的数据框,正如您所看到的,每个基因都有多个相关变量(例如,前两行都与基因X1相关)

如何为X1选择变量最大的探针,为X2选择变量最大的探针,为X3选择变量最大的探针?我将使用每行的中位数绝对偏差来计算可变性,从而为我提供可变性的度量。数据帧的尺寸相当大(439385 x 32)

编辑

我用这个函数计算了中位数绝对偏差,是的

 dataframe$MAD<-apply(dataframe,1,mads) 

dataframe$MAD正如罗纳德在评论中所说的,您应该更具体地告诉我们您在哪一方面遇到了困难。此外,最好提供一个虚拟示例数据集以及该集的预期结果。这样可以更好地了解目的

选择标准是否使偏离平均值的总和最大化?如果是这样的话,下一个代码将执行您想要的操作。它没有针对速度进行优化,旨在易于遵循

 sampleFrame=data.frame(P1=c(3,4,2,1,5,6),P2=c(2,4,6,10,2,7),
    Gene=c('X1','X1','X2','X2','X2','X3'))

 dataCols = grep('^P',colnames(sampleFrame))
 namesCols = colnames(sampleFrame)[dataCols] 
 maximunsPerX = by(sampleFrame[,dataCols],sampleFrame[,'Gene'],function(x){   
   medians = apply(as.matrix(x),1,median)  
   names(medians) = NULL   
   mediansDesviation = abs(as.matrix(x) - medians)   
   sumOfMedianDesviation = colSums(mediansDesviation)    
   theMaximun = which.max(medians)   
   return(x[theMaximun,]) 
 })

 maxSample = do.call('rbind',maximunsPerX)

你应该展示你已经尝试过的东西。例如,我乐观地认为您能够计算给定行的中值绝对偏差。
dataframe<-dataframe[rev(order(dataframe$MAD)),]
genes.vec<-as.character(dataframe$Gene[!duplicated(dataframe$Gene)])
dataframe2<-dataframe[match(genes.vec,dataframe$Gene),]
 sampleFrame=data.frame(P1=c(3,4,2,1,5,6),P2=c(2,4,6,10,2,7),
    Gene=c('X1','X1','X2','X2','X2','X3'))

 dataCols = grep('^P',colnames(sampleFrame))
 namesCols = colnames(sampleFrame)[dataCols] 
 maximunsPerX = by(sampleFrame[,dataCols],sampleFrame[,'Gene'],function(x){   
   medians = apply(as.matrix(x),1,median)  
   names(medians) = NULL   
   mediansDesviation = abs(as.matrix(x) - medians)   
   sumOfMedianDesviation = colSums(mediansDesviation)    
   theMaximun = which.max(medians)   
   return(x[theMaximun,]) 
 })

 maxSample = do.call('rbind',maximunsPerX)