根据列

时间:2018-05-09 16:30:23

标签: r dplyr

我正在尝试从以下构建数据框:

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

此处我们有两个名为sequence1sequence2的序列,长度均为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 :(得分:1)

根据更新的预期输出,arrange'样本'后,按'样本'分组,将'pos'更新为row_number,然后执行基于substr的{​​{1}}在'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