2012-09-21 9 views
5

मैं एक data.frame जिसमें प्रत्येक जीन नाम बार-बार और 2 स्थितियों के लिए मान शामिल है:एक डेटा फ्रेम में लगातार पंक्तियों के जोड़े betwen अंतर की गणना - आर

df <- data.frame(gene=c("A","A","B","B","C","C"), 
condition=c("control","treatment","control","treatment","control","treatment"), 
count=c(10, 2, 5, 8, 5, 1), 
sd=c(1, 0.2, 0.1, 2, 0.8, 0.1)) 

    gene condition count sd 
1 A control 10 1.0 
2 A treatment  2 0.2 
3 B control  5 0.1 
4 B treatment  8 2.0 
5 C control  5 0.8 
6 C treatment  1 0.1 

मैं अगर गणना करना चाहते हैं वहाँ उपचार के बाद "गिनती" में वृद्धि या कमी है और उन्हें चिह्नित करें और/या उन्हें सबसेट करें। (पिछले कॉलम वैकल्पिक है)

for each unique(gene) do 
    if df[geneRow1,3]-df[geneRow2,3] > 0 then gene is "up" 
     else gene is "down" 

यह वही है अंत में दिखाई देना चाहिए:: यह (छद्म कोड) है

up-regulated 
gene condition count sd regulation 
B control  5 0.1 up 
B treatment 8 2.0 up 

down-regulated 
gene condition count sd regulation 
A control  10 1.0 down 
A treatment 2 0.2 down 
C control  5 0.8 down 
C treatment 1 0.1 down 

मैं इस के साथ मेरे दिमाग बटोर कर दिया है, के साथ खेल सहित ddply, और मैं एक समाधान खोजने में विफल रहा है - कृपया एक बेकार जीवविज्ञानी।

चीयर्स।

उत्तर

5

plyr समाधान कुछ ऐसा दिखाई देगा:

library(plyr) 
reg.fun <- function(x) { 
    reg.diff <- x$count[x$condition=='control'] - x$count[x$condition=='treatment'] 
    x$regulation <- ifelse(reg.diff > 0, 'up', 'down') 

    x 
} 

ddply(df, .(gene), reg.fun) 


    gene condition count sd regulation 
1 A control 10 1.0   up 
2 A treatment  2 0.2   up 
3 B control  5 0.1  down 
4 B treatment  8 2.0  down 
5 C control  5 0.8   up 
6 C treatment  1 0.1   up 
> 

तुम भी एक अलग आकार में और/या डेटा के साथ एक अलग पैकेज के साथ ऐसा करने के बारे में सोच सकता है:

df.w <- reshape(df, direction='wide', idvar='gene', timevar='condition') 

library(data.table) 
DT <- data.table(df.w, key='gene') 

DT[, regulation:=ifelse(count.control-count.treatment > 0, 'up', 'down'), by=gene] 

    gene count.control sd.control count.treatment sd.treatment regulation 
1: A   10  1.0    2   0.2   up 
2: B    5  0.1    8   2.0  down 
3: C    5  0.8    1   0.1   up 
>  
+0

शानदार, यह काम किया! मुझे लगा कि डीडीपीई जवाब का हिस्सा हो सकता है लेकिन मुझे नहीं लगता कि मैं कभी भी reg.fun के साथ आऊंगा। चीयर्स। – fridaymeetssunday

+0

@krespim और यहां एक [बेंचमार्क] (http://stackoverflow.com/revisions/11463757/3) पंक्तियों के समूह को जोड़ना है जो plyr से डेटा.table की तुलना करता है। –

3

कुछ इस तरह :

df$up.down <- with(df, ave(count, gene, 
       FUN=function(diffs) c("up", "down")[1+(diff(diffs) < 0) ])) 
spltdf <- split(df, df$up.down) 

> df 
    gene condition count sd up.down 
1 A control 10 1.0 down 
2 A treatment  2 0.2 down 
3 B control  5 0.1  up 
4 B treatment  8 2.0  up 
5 C control  5 0.8 down 
6 C treatment  1 0.1 down 
> spltdf 
$down 
    gene condition count sd up.down 
1 A control 10 1.0 down 
2 A treatment  2 0.2 down 
5 C control  5 0.8 down 
6 C treatment  1 0.1 down 

$up 
    gene condition count sd up.down 
3 B control  5 0.1  up 
4 B treatment  8 2.0  up 
संबंधित मुद्दे