Создать строки на основе подстроки столбца - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь построить фрейм данных из следующего:

seq_name <- c('sequence1', 'sequence2')
seqs <- c('ATCGGA', 'TTGCGA')
seq_length <- 6

Здесь у нас есть две последовательности, называемые sequence1 и sequence2, каждая из которых имеет длину 6 букв (например, ATCGGA)

Я хочу создать фрейм данных с тремя столбцами:

  • образец - содержащий имя последовательности - например: sequence1
  • seq - содержит последовательность - например: ATCGGA
  • pos - содержит индексную позицию для каждой позиции в 1:length(seq) - например: 1

Я делаю это следующим образом:

df <- data.frame(rep(seq_name, seq_length) , rep(seqs, seq_length), pos=seq(1:seq_length))
colnames(df) <- c("sample", "seq", "pos")
str(df)

Однако, это не совсем правильный результат, так как у меня нет pos=2 для sequence1:

df %>% 
  arrange(sample) %>% 
  head()

           sample    seq pos
1 sequence1 ATCGGA   1
2 sequence1 ATCGGA   3
3 sequence1 ATCGGA   5
4 sequence1 ATCGGA   1
5 sequence1 ATCGGA   3
6 sequence1 ATCGGA   5

В то время как я хочу:

     sample    seq pos
1 sequence1 ATCGGA   1
2 sequence1 ATCGGA   2
3 sequence1 ATCGGA   3
4 sequence1 ATCGGA   4
5 sequence1 ATCGGA   5
6 sequence1 ATCGGA   6

Затем я хочу перебрать каждую строку, и для каждой позиции в pos взять букву из seq, которая соответствует этой позиции.

Например:

Ожидаемые результаты должны быть:

     sample    seq   pos   nuc
      <fctr> <fctr> <int> <chr>
 1 sequence1 ATCGGA     1     A
 2 sequence1 ATCGGA     2     T
 3 sequence1 ATCGGA     3     C
 4 sequence1 ATCGGA     4     G
 5 sequence1 ATCGGA     5     G
...

Вот что я пытаюсь:

library(dplyr)
df <- df %>% 
  group_by(sample) %>% 
  arrange(sample, pos) %>% 
  mutate(nuc = substr(seq, 1:n(), pos) )

Однако это не дает мне ожидаемого результата. Вместо этого первые две строки:

      sample    seq   pos   nuc
      <fctr> <fctr> <int> <chr>
 1 sequence1 ATCGGA     1     A
 2 sequence1 ATCGGA     1      
 3 sequence1 ATCGGA     3     C
 4 sequence1 ATCGGA     3      
 5 sequence1 ATCGGA     5     G

1 Ответ

0 голосов
/ 09 мая 2018

На основании обновленного ожидаемого результата, после arrange, используя 'sample', сгруппированный по 'sample', обновите 'pos' как row_number, а затем выполните substr на основе 'pos'

library(dplyr)
out <- df %>% 
         arrange(sample) %>% 
         group_by(sample) %>% 
         mutate(pos = row_number(), 
                nuc = substr(seq, pos, pos)) 

head(out, 6)
# A tibble: 6 x 4
# Groups:   sample [1]
#  sample    seq      pos nuc  
#  <fct>     <fct>  <int> <chr>
#1 sequence1 ATCGGA     1 A    
#2 sequence1 ATCGGA     2 T    
#3 sequence1 ATCGGA     3 C    
#4 sequence1 ATCGGA     4 G    
#5 sequence1 ATCGGA     5 G    
#6 sequence1 ATCGGA     6 A 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...