Как извлечь позиции средней точки для каждого имени записи из фрейма данных в R? - PullRequest
1 голос
/ 01 марта 2020

У меня есть этот файл:

chromosome   start     end       name short.name start.gene  middle
chr8 7447754 7447754  SPAG11B_1    SPAG11B    7447754 7447754
chr8 7462707 7462707  SPAG11B_2    SPAG11B    7447754 7462707
chr8 7463443 7463443  SPAG11B_3    SPAG11B    7447754 7463443
chr8 7470308 7470308 DEFB104B_1   DEFB104B    7470308 7470308
chr8 7475011 7475011 DEFB104B_2   DEFB104B    7470308 7475011
chr8 7896474 7896474   DEFB4A_2     DEFB4A    7894677 7896474

который я загружаю в кадр данных R с помощью:

> df <- read.table("a", header=T)
> df
  chromosome   start     end       name short.name start.gene  middle
1       chr8 7447754 7447754  SPAG11B_1    SPAG11B    7447754 7447754
2       chr8 7462707 7462707  SPAG11B_2    SPAG11B    7447754 7462707
3       chr8 7463443 7463443  SPAG11B_3    SPAG11B    7447754 7463443
4       chr8 7470308 7470308 DEFB104B_1   DEFB104B    7470308 7470308
5       chr8 7475011 7475011 DEFB104B_2   DEFB104B    7470308 7475011
6       chr8 7896474 7896474   DEFB4A_2     DEFB4A    7894677 7896474

Теперь мне нужно извлечь вектор, содержащий точку в середине начальная и конечная позиции каждого уникального short.name. Например, короткое имя SPAG11B содержит три записи: первое start в 7447754 и последнее end в 7463443. Итак, для этого имени я бы хотел получить 0.5*(7447754+7463443), то есть 7455598. И то же самое для всех других short.name значений:

7455598 ## SPAG11B:  0.5*(7447754+7463443)
7472660 ## DEFB104B: 0.5*(7470308+7475011)
7896474 ## DEFB4A:   0.5*(7896474+7896474)

Окончательным результатом для приведенного выше примера будет вектор с такими значениями:

7455598, 7472660, 7896474

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 01 марта 2020

Мы можем сгруппировать по 'short.name', получить first и last элемент 'middle', суммировать его и умножить на 0.5

library(dplyr)
df %>%
  group_by(short.name) %>%
  summarise(middle = 0.5 *(first(middle) + last(middle))) %>%
  pull(middle)
  #[1] 7472660 7896474 7455598

data

df <- structure(list(chromosome = c("chr8", "chr8", "chr8", "chr8", 
"chr8", "chr8"), start = c(7447754L, 7462707L, 7463443L, 7470308L, 
7475011L, 7896474L), end = c(7447754L, 7462707L, 7463443L, 7470308L, 
7475011L, 7896474L), name = c("SPAG11B_1", "SPAG11B_2", "SPAG11B_3", 
"DEFB104B_1", "DEFB104B_2", "DEFB4A_2"), short.name = c("SPAG11B", 
"SPAG11B", "SPAG11B", "DEFB104B", "DEFB104B", "DEFB4A"), 
start.gene = c(7447754L, 
7447754L, 7447754L, 7470308L, 7470308L, 7894677L), middle = c(7447754L, 
7462707L, 7463443L, 7470308L, 7475011L, 7896474L)), class = "data.frame", row.names = c(NA, 
-6L))
1 голос
/ 01 марта 2020

Вы можете использовать пакет data.table следующим образом:

df <- read.table(header = TRUE, text = "
chromosome   start     end       name short.name start.gene  middle
chr8 7447754 7447754  SPAG11B_1    SPAG11B    7447754 7447754
chr8 7462707 7462707  SPAG11B_2    SPAG11B    7447754 7462707
chr8 7463443 7463443  SPAG11B_3    SPAG11B    7447754 7463443
chr8 7470308 7470308 DEFB104B_1   DEFB104B    7470308 7470308
chr8 7475011 7475011 DEFB104B_2   DEFB104B    7470308 7475011
chr8 7896474 7896474   DEFB4A_2     DEFB4A    7894677 7896474")

library(data.table)
setDT(df)[, 0.5 * (start[1] + end[.N]), short.name]$V1
# 7455599 7472660 7896474
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...