2014-11-20 6 views
1

У меня есть dataframe с несколькими столбцами информации, например:R резюме высчитывает dataframe из dataframe с несколькими столбцами информации

df <- data.frame(chr=c("chr1", "chr1", "chr1", "chr1", "chr1", "chr1", "chr1", "chr1", "chr2", "chr2"), Gene=c("Happy", "Happy", "Happy", "Happy", "Happy", "Happy", "Happy", "Happy", "Sad", "Sad"), site = c(100, 120, 130, 300, 2000, 2300, 2342, 2451, 120, 123), value=c(20, 25, 21, 30, -80, 31, -79, -90, 10, 13)) 

> df 
    chr Gene site value 
1 chr1 Happy 100 20 
2 chr1 Happy 120 25 
3 chr1 Happy 130 21 
4 chr1 Happy 300 30 
5 chr1 Happy 2000 -80 
6 chr1 Happy 2300 31 
7 chr1 Happy 2342 -79 
8 chr1 Happy 2451 -90 
9 chr2 Sad 120 10 
10 chr2 Sad 123 13 

Я хотел бы создать сводную dataframe, который вычисляет для каждого гена том, сколько кластерные регионы есть. Я считаю, что кластер имеет любое количество строк, где разница в номере сайта не превышает 1000 (мои данные сортируются по chr и сайтам). Для начала я создал новый столбец для вычисления расстояния между узлами в последовательных строках с помощью:

df$Distance <- c(1001, diff(df$site, lag=1, differences=1)) 

> df 
    chr Gene site value Distance 
1 chr1 Happy 100 20  1001 
2 chr1 Happy 120 25  20 
3 chr1 Happy 130 21  10 
4 chr1 Happy 300 30  170 
5 chr1 Happy 2000 -80  1700 
6 chr1 Happy 2300 31  300 
7 chr1 Happy 2342 -79  42 
8 chr1 Happy 2451 -90  109 
9 chr2 Sad 120 10 -2331 
10 chr2 Sad 123 13  3 

Я хотел бы создать сводную таблицу со строкой для каждого гена, который суммирует сколько кластеров находятся в пределах каждого гена где среднее значение является либо положительным, либо отрицательным. В приведенном выше примере таблица будет выглядеть следующим образом:

Gene PositiveClusters NegativeClusters 
1 Happy    1    1 
2 Sad    1    0 
+0

@beginneR Я считаю, что кластер представляет собой группу сайтов, где расстояние между двумя сайтами не превышает 1000. Вот почему я вычислил расстояние между двумя сайтами, так что, если расстояние больше 1000, то сайт является началом нового кластера. – user2165857

ответ

0

Вот data.table решение - но у меня есть ощущение, что есть более эффективный способ ...

library(data.table) 
setDT(df)[,cluster:=c(0,cumsum(diff(site)>1000)),by=Gene] 
df[,mean:=mean(value),by=list(Gene,cluster)] 
df[,list(pos=length(unique(cluster[mean>=0])), 
     neg=length(unique(cluster[mean<0]))),by=Gene] 
#  Gene pos neg 
# 1: Happy 1 1 
# 2: Sad 1 0 

Так что превращает df в таблицу data.table и добавляет столбец cluster на основе cumsum(diff(site)>1000), сгруппированных по Gene. Это очень типичный шаблон для генерации переменных группировки.

Затем мы добавим колонку mean, которая является mean(value), сгруппированы как Gene, так и cluster.

Затем мы создаем новую таблицу данных, которая имеет подсчеты каждого типа кластера для среднего либо положительного (> = 0), либо отрицательного (< 0), сгруппированного по Gene.