Подсчитать значения в data.frame, которые попадают в диапазон, используя скользящее окно - PullRequest
1 голос
/ 03 апреля 2019

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

То, что я хочу в не-коде:
-Количество вхождений "m4C "(столбец 1) на положительной нити (столбец 6) в первые 200 п.н. (столбец 2)
- введите вышеприведенное значение для следующих 200 п.н. или любого размера окна, который я хочу выбрать.
IЯ также буду модифицировать, чтобы посмотреть на другие типы модификаций и обе ветви, как только у меня будет основной фрагмент.

Я посмотрел на rollapply из зоопарка, но не знаю, как создать функцию дляэто сочетание условий.Я также видел это https://stats.stackexchange.com/questions/3051/mean-of-a-sliding-window-in-r
, но я не знаю достаточно, чтобы переместить его за пределы простой функции, используемой там.Я нашел способ сделать это в Excel, используя COUNTIFS

COUNTIFS($A:$A,"m4C",$F:$F,"+",$B:$B,">"&$S3,$B:$B,"<"&$T3)

, где вызовы столбцов S и T задают верхний и нижний диапазоны для окна, но я хотел бы использовать R дляНу, причины.

Пример данных:

type    start   end seqid   score   strand
m6A 2   2   NC_002932.3 44  -
modified_base   20  20  NC_002932.3 41  -
m6A 57  57  NC_002932.3 451 -
modified_base   69  69  NC_002932.3 55  +
m6A 80  80  NC_002932.3 540 +
modified_base   93  93  NC_002932.3 55  +
m4C 139 139 NC_002932.3 37  +
m6A 196 196 NC_002932.3 422 +
m4C 200 200 NC_002932.3 40  +
m6A 204 204 NC_002932.3 571 -
m6A 210 210 NC_002932.3 477 -
m6A 255 255 NC_002932.3 500 -
modified_base   264 264 NC_002932.3 32  +

Требуемый вывод из вышеперечисленного:
0-200 1
200-400 1

Реальные файлы имеют десятки тысячлиний.Заранее благодарю за любую помощь.У меня есть данные в виде файлов, разделенных табуляцией, которые я с удовольствием прочитал бы в любой форме, чтобы получить то, что хотел, но играл с data.frame, потому что это то, что я знаю до сих пор.

1 Ответ

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

Вот подход dplyr:

library(dplyr)
df2 <- df %>%
  group_by(grp = start %/% 200 + 1) %>%
  summarize(min = min(start),
            max = max(start),
            count = sum(type == "m4C")) 
#> df2
## A tibble: 2 x 4
#    grp   min   max count
#  <dbl> <dbl> <dbl> <int>
#1     1     2   196     1
#2     2   200   264     1



# additional step to match output more closely
df2 %>%
  mutate(group = paste0(min, "-", max)) %>%
  select(group, count)

## A tibble: 2 x 2
#  group   count
#  <chr>   <int>
#1 2-196       1
#2 200-264     1

Загрузка данных:

df <- read.table(
  header = T, 
  stringsAsFactors = F,
  text = "type    start   end seqid   score   strand
m6A 2   2   NC_002932.3 44  -
modified_base   20  20  NC_002932.3 41  -
m6A 57  57  NC_002932.3 451 -
modified_base   69  69  NC_002932.3 55  +
m6A 80  80  NC_002932.3 540 +
modified_base   93  93  NC_002932.3 55  +
m4C 139 139 NC_002932.3 37  +
m6A 196 196 NC_002932.3 422 +
m4C 200 200 NC_002932.3 40  +
m6A 204 204 NC_002932.3 571 -
m6A 210 210 NC_002932.3 477 -
m6A 255 255 NC_002932.3 500 -
modified_base   264 264 NC_002932.3 32  +")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...