2014-02-18 32 views
0

我有一百萬行以上的列表。計算R中的平均配對差異

chr_position sick1 sick2 ... sick14 control1 control2 ... control14 p-value 
chr1_1231 87.8 100 96.1 89.5 NA NA 93.8 95.7 95.5 92 NA 100 90.9 NA 100 NA 94.3 90.6 NA 92.5 100 86.7 NA NA 86.4 84.2 NA 90 0.844 
chr2_412 96.1 NA 90.5 98 95.8 95.2 100 NA NA 97.5 NA 100 100 NA 100 98.5 NA 100 NA 100 100 93.6 NA 100 NA NA 93.3 NA 0.59 
... 

我想計算每行的(病態1與控制1)...(病態14與控制14)的平均配對差異。

理想情況下,我想的

chr_position pair1diff pair2diff ... pair14diff count_of_valid_pairs paired_diff 

輸出我意識到這是一個簡單的Excel的問題,但由於大的行數,它不是要在Excel中進行是可行的。我試着簡單搜索,但我不認爲combn會適用。感謝您的任何建議。

回答

0

如果你的列是一致的和相鄰的,你可以用矢量數學來減去它們。下面是一個例子(我只合成數據爲1:4不1:14,但你的想法)只是改變abs(df[,2:5]-df[,6:9])位說abs(df[,1:15]-df[,16:29])

df<-data.frame(chrposition=sample(LETTERS,1000,T), 
sick1=runif(1000), 
sick2=runif(1000), 
sick3=runif(1000), 
sick4=runif(1000), 
control1=runif(1000), 
control2=runif(1000), 
control3=runif(1000), 
control4=runif(1000), 
pval=0.9+(runif(1000)*0.1)) 


new.df<-cbind(chrposition=df$chrposition, 
       abs(df[,2:5]-df[,6:9]), # vector diff between cols 2-5 and 6-9 
       pval=df$pval) 

head(new.df) 

    chrposition  sick1  sick2  sick3  sick4  pval 
1   O 0.21122616 0.28441462 0.4917417 0.06320374 0.9119544 
2   I 0.15434718 0.07624787 0.6844081 0.19595290 0.9494703 
3   A 0.03824239 0.63021683 0.2989420 0.59546995 0.9529900 
4   M 0.55047434 0.11957975 0.5392134 0.05878512 0.9140963 
5   H 0.20543950 0.48312551 0.1006623 0.34576621 0.9461521 
6   R 0.74644532 0.12232382 0.1352527 0.67883728 0.9465176 
0

這實際上是R中非常簡單

例如:

# Generate some data 
data <- matrix(rnorm(28*10000), ncol=28) 
colnames(data) <- c(paste0("sick", 1:14), paste0("ctrl", 1:14)) 

diffs <- data[,1:14]-data[,15:28] 

當然,您應該根據數據結構更改列索引。

+0

謝謝。這看起來是正確的,但是當我添加output = c(data [,1],diffs,data [,30])write.table(file =「testingoutput.txt」,output,row.names = FALSE,col.names = FALSE,quote = FALSE,append = TRUE)爲我所需的輸出文件,什麼都沒有出來。 – user3222627

+0

你有'diffs'中的正確數據嗎? – nico