Υπολογίστε άθροισμα των αξιών επικαλυπτόμενων με ένα άλλο dataframe στην Ε

ψήφοι
0

Έχω δύο dataframes ως εξής

depth
chr  Pos Nucleotide Coverage
chr1 1   A          10
chr1 2   G          12
chr1 3   T          3
chr1 4   A          20
chr1 5   T          22
chr1 6   N          0
chr1 7   N          0
chr2 23  A          1
chr2 24  T          5
chr2 25  G          15

και ένα άλλο dataframe των διαστημάτων

intervals

chr1  3  5
chr2 23 25
chr4  1 30

Επιθυμητή έξοδο μου είναι η εξής: αν υπάρχουν θέσεις στον depthdataframe που εμπίπτουν εντός της περιοχής όπως αναφέρεται στο intervalsdataframe με την ίδια chrαξία, το Coverageάθροισμα επί όλων των νουκλεοτιδίων υπολογίζεται για αυτό το εύρος και τοποθετήθηκε στο 4η στήλη.

chr1  3  5 45
chr2 23 25 21
chr4  1 30  0

και

chr1 3   T  3
chr1 4   A 20
chr1 5   T 22
chr2 23  A  1
chr2 24  T  5
chr2 25  G 15

Πώς μπορώ να δημιουργήσω αυτά τα δύο dataframes χρησιμοποιώντας R. έχω πολύ μεγάλα αρχεία για το βάθος dataframe με το μέγεθος των 50GB.

Δημοσιεύθηκε 27/11/2018 στις 17:39
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
1

Μπορείς να χρησιμοποιήσεις sqldf

library(sqldf)

out1 <- sqldf('
select    i.*
          , coalesce(sum(d.Coverage), 0) as CovSum
from      intervals i
          left join depth d
            on  d.Pos between i.low and i.high
                and d.chr = i.chr
group by  i.chr, i.low, i.high
')
out1        
#    chr low high CovSum
# 1 chr1   3    5     45
# 2 chr2  23   25     21
# 3 chr4   1   30      0

out2 <- sqldf('
select    d.*
from      intervals i
          join depth d
            on  d.Pos between i.low and i.high
                and d.chr = i.chr
')
out2
#    chr Pos Nucleotide Coverage
# 1 chr1   3          T        3
# 2 chr1   4          A       20
# 3 chr1   5          T       22
# 4 chr2  23          A        1
# 5 chr2  24          T        5
# 6 chr2  25          G       15

χρησιμοποιούνται τα δεδομένα

library(data.table)

depth <- fread('
chr  Pos Nucleotide Coverage
chr1 1   A          10
chr1 2   G          12
chr1 3   T          3
chr1 4   A          20
chr1 5   T          22
chr1 6   N          0
chr1 7   N          0
chr2 23  A          1
chr2 24  T          5
chr2 25  G          15
')

intervals <- fread('
chr   low high
chr1  3  5
chr2 23 25
chr4  1 30
')
Απαντήθηκε 27/11/2018 στις 18:09
πηγή χρήστη

ψήφοι
0

dplyr λειτουργεί μεγάλο για αυτά τα είδη των εργασιών:

# first, read in the data, with headers
depth <- read.table(header = T, text = 
"chr  Pos Nucleotide Coverage
chr1 1   A          10
chr1 2   G          12
chr1 3   T          3
chr1 4   A          20
chr1 5   T          22
chr1 6   N          0
chr1 7   N          0
chr2 23  A          1
chr2 24  T          5
chr2 25  G          15")

intervals <- read.table(header = T, text =
"chr  start   end
chr1  3  5
chr2 23 25
chr4  1 30")

Τώρα μπορείτε να πάρετε για να εργαστούν:

library(dplyr)
# create a new data.frame:
# link intervals with any rows from depth where the value of 'chr' matches
# (keeping all rows from intervals)

merged <-
  merge(intervals, depth, by = 'chr', all.x = T) %>%

  mutate(
    # add a column to flag rows in the range spec'd by intervals
    in_range = Pos >= start & Pos <= end,
    # substitute 0 for any missing values in Coverage
    Coverage = coalesce(Coverage, 0L))

# now you can get your results:

result1 <- 
  merged %>% 
  # keep those in range or with no value from depth$Pos
  filter(in_range | is.na(Pos)) %>%
  group_by(chr, start, end) %>%
  summarise(sum_cov = sum(Coverage))

result2 <-
  merged %>%
  # keep those in range
  filter(in_range ==T) %>%
  # only get the columns that were in depth
  select(names(depth))

Τα αποτελέσματα είναι όπως αναμένεται:

> result1
  chr   start   end sum_cov
1 chr1      3     5      45
2 chr2     23    25      21
3 chr4      1    30       0

> result2
   chr Pos Nucleotide Coverage
1 chr1   3          T        3
2 chr1   4          A       20
3 chr1   5          T       22
4 chr2  23          A        1
5 chr2  24          T        5
6 chr2  25          G       15
Απαντήθηκε 27/11/2018 στις 18:07
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more