我正在尝试从以下构建数据框:
seq_name <- c('sequence1', 'sequence2')
seqs <- c('ATCGGA', 'TTGCGA')
seq_length <- 6
此处我们有两个名为sequence1
和sequence2
的序列,长度均为6个字母(例如ATCGGA
)
我想创建一个包含三列的数据框:
sequence1
ATCGGA
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
答案 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