在数据框中计算相邻行之间的差异 - R

5

我有一个 data.frame,其中每个基因名称都会重复出现,并包含 2 种条件的值:

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

我希望计算出在处理后"count"是否增加或减少,并将其标记为这样的状态和/或对它们进行子集划分。即(伪代码):
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进行尝试,但都未能找到解决方案 - 求助于一个无助的生物学家。

谢谢。

2个回答

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
>     

太棒了,它起作用了!我有一种感觉ddply可能是答案的一部分,但我不认为我会想出reg.fun。干杯。 - fridaymeetssunday
@krespim 这里是一份分组成对行的基准测试,比较了plyr和data.table。 - Matt Dowle

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接