2012-09-21 11 views
5

Her gen adı tekrar edildi ve 2 koşulları için değerleri içeren edildiği bir data.frame vardır: I halinde hesaplamak istiyorbir veri çerçevesi içinde ardışık sıra çiftlerinin betwen farkı hesapla - R

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 

orada tedaviden sonra "sayımda" bir artış veya azalmadır ve bunları işaretlemekte ve/veya alt gruplara ayırmaktadır. (Son sütun isteğe bağlıdır) o sonunda nasıl görünmesi gerektiği

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

Bu: O (sözde kod) 'dir

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 

Ben oynarken dahil olmak üzere bu ile beynimi yan yatan edilmiştir ddply ve bir çözüm bulamadım - lütfen şanssız bir biyolog.

Şerefe.

cevap

5

plyr çözüm gibi görünecektir:

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 
> 
Ayrıca farklı bir şekil ve/veya veri ile farklı bir paketle bunu düşünebildiğim

: Böyle

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

Parlak, işe yaradı! Ben ddply cevabın bir parçası olabileceğini hissettim ama asla reg.fun ile geleceğini sanmıyorum. Şerefe. – fridaymeetssunday

+0

Krespim Ve plyr'i data.table ile karşılaştıran bir grup çift satır grubunun [benchmark] (http://stackoverflow.com/revisions/11463757/3). –

3

Something :

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 
İlgili konular