Существует ли функция R для добавления столбца индекса (числовой или символьный идентификатор) в большой кадр данных по положению групп значений в блоках? - PullRequest
1 голос
/ 10 апреля 2019

Я пытался создать код для добавления определенных индексов к большим фреймам данных (в среднем 21000 строк делятся на 400 блоков и 10 столбцов) по положению идентификатора contigs в блоках. Блоки задаются положением геномных диапазонов в геноме. Я тоже искал соответствующую тему в интернете. Я не смог создать / найти подходящий код для моей проблемы.

Пример данных перед индексацией


seqnames = sprintf("H7",seq(1:8))
start <- c(0,11,0,11,0,21,31,11)
end <- c(10,20,10,20,10,30,40,20)
strand <- sprintf("*", seq(1:8))
cont_ID <- c("001","001","004","004","003","001","001","003")
block <- c(seq(1:8))

df <- data.frame(seqnames,start,end,strand,block,cont_ID)

names(df) <- c("seqnames","start","end","strand","block","contig_ID")
   seqnames start end  strand  block  contig_ID
1       H7     0  10      *     1       001
2       H7    11  20      *     2       001
3       H7     0  10      *     3       004
4       H7    11  20      *     4       004
5       H7     0  10      *     5       003
6       H7    21  30      *     6       001
7       H7    31  40      *     7       001
8       H7    11  20      *     8       003

Ожидаемый результат

Идеальный индекс отмечает как соединение идентификатора contig с контигами с одинаковым идентификатором (т. Е. Использует одно и то же значение из столбца contig_ID), так и конкретную позицию контига или группы контигов с одинаковым идентификатором к другим контигам в последовательности строк. Конкретная позиция задается начальным и конечным столбцами. Если значения из начальных столбцов непосредственно следуют за предыдущими значениями из конечного столбца и не разделены контигами с другим идентификатором, то это «один блок», который мне нужно пометить индексом. В приведенном ниже примере я использовал для обозначения конкретной позиции / комбинации букв и идентификаторов контигов.

фрейм данных с нужными индексами (индекс столбца):

   seqnames start end strand block contig_ID  index
1       H7     0  10      *     1     001     A_001
2       H7    11  20      *     2     001     A_001
3       H7     0  10      *     3     004     A_004
4       H7    11  20      *     4     004     A_004
5       H7     0  10      *     5     003     A_003
6       H7    21  30      *     6     001     B_001
7       H7    31  40      *     7     001     B_001
8       H7    11  20      *     8     003     B_003

Большое спасибо за помощь!

1 Ответ

0 голосов
/ 10 апреля 2019

Используя data.table, вы можете сделать это:

library(data.table)

df <- as.data.table(data.frame(seqnames,start,end,strand,block,cont_ID))

sp <- split(df,f = cont_ID)

grouping <- function(x){

  x[, block_lag:= shift(block, fill = "lag")]
  x[is.na(block_lag), cumsum_block_lag:=1]
  x[!is.na(block_lag), cumsum_block_lag:=1+cumsum(block!=(block_lag+1))]
  x[, index:=paste0(LETTERS[cumsum_block_lag],"_",cont_ID)]
  x[, cumsum_block_lag:=NULL]
  x[, block_lag:=NULL]
}

index_sp <- rbindlist(lapply(sp, grouping))
index_sp <- index_sp[order(block)]


#   seqnames start end strand block cont_ID index
#1:       H7     0  10      *     1     001 A_001
#2:       H7    11  20      *     2     001 A_001
#3:       H7     0  10      *     3     004 A_004
#4:       H7    11  20      *     4     004 A_004
#5:       H7     0  10      *     5     003 A_003
#6:       H7    21  30      *     6     001 B_001
#7:       H7    31  40      *     7     001 B_001
#8:       H7    11  20      *     8     003 B_003
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...