Select 在特定位置具有指定碱基的所有样本
Select all samples with a specified base at a particular position
我是 R 语言编程的新手,正在尝试完成一项非常具体的任务。
我有一个包含 n 个样本的 fasta 序列,我在 ape
:
中读到了
library(ape)
matrix <- read.dna(myfasta, format="fasta", as.character=TRUE)
这创建了一个矩阵,如下所示:
| | V1 | V2 | V3 | V4 |...
|------------------------|
|Seq1| a | t | g | c |...
|Seq2| a | t | g | a |...
|Seq3| a | t | c | c |...
|Seq4| t | t | g | a |...
|... |
其中Seq(n)是每个样本的DNA序列,V(n)表示核苷酸位置。
如何 select 带有特定核苷酸(例如“a”)的序列,在特定位置(例如“V1”),然后 return 序列作为串联字符串?
所以对于位置 V1,我想要类似“Seq1、Seq2、Seq3”的东西,对于位置 V4,对于相同的碱基,我想要“Seq2、Seq4”
我试过 which()
和 filter(matrix, V1 == "a")
但我很挣扎。
提前致谢!
最简单的方法是select V1 == 'a'
行用布尔索引,然后提取rownames
:
rownames(example[example[,"V1"] == "a", ]) # "No304" "No306"
你提到了 filter
,看起来像 dplyr
。使用 tidyverse 方法来操作行名很重要的数据有点麻烦,因为默认情况下会删除行名。
如果您想使用 filter
,您必须先将行名称保存为显式列:
library(dplyr)
as.data.frame(example) %>%
mutate(sequence = rownames(.), .before = everything()) %>%
filter(V1 == "a") %>%
select(sequence)
sequence
1 No304
2 No306
数据(来自ape
read.dna docs)
library(ape)
cat(">No305",
"NTTCGAAAAACACACCCACTACTAAAANTTATCAGTCACT",
">No304",
"ATTCGAAAAACACACCCACTACTAAAAATTATCAACCACT",
">No306",
"ATTCGAAAAACACACCCACTACTAAAAATTATCAATCACT",
file = "exdna.fas", sep = "\n")
example <- read.dna("exdna.fas", format = "fasta", as.character = TRUE)
colnames(example) <- paste0("V", 1:ncol(example))
example
V1 V2 V3 V4 ...
No305 "n" "t" "t" "c"
No304 "a" "t" "t" "c"
No306 "a" "t" "t" "c"
我是 R 语言编程的新手,正在尝试完成一项非常具体的任务。
我有一个包含 n 个样本的 fasta 序列,我在 ape
:
library(ape)
matrix <- read.dna(myfasta, format="fasta", as.character=TRUE)
这创建了一个矩阵,如下所示:
| | V1 | V2 | V3 | V4 |...
|------------------------|
|Seq1| a | t | g | c |...
|Seq2| a | t | g | a |...
|Seq3| a | t | c | c |...
|Seq4| t | t | g | a |...
|... |
其中Seq(n)是每个样本的DNA序列,V(n)表示核苷酸位置。
如何 select 带有特定核苷酸(例如“a”)的序列,在特定位置(例如“V1”),然后 return 序列作为串联字符串?
所以对于位置 V1,我想要类似“Seq1、Seq2、Seq3”的东西,对于位置 V4,对于相同的碱基,我想要“Seq2、Seq4”
我试过 which()
和 filter(matrix, V1 == "a")
但我很挣扎。
提前致谢!
最简单的方法是select V1 == 'a'
行用布尔索引,然后提取rownames
:
rownames(example[example[,"V1"] == "a", ]) # "No304" "No306"
你提到了 filter
,看起来像 dplyr
。使用 tidyverse 方法来操作行名很重要的数据有点麻烦,因为默认情况下会删除行名。
如果您想使用 filter
,您必须先将行名称保存为显式列:
library(dplyr)
as.data.frame(example) %>%
mutate(sequence = rownames(.), .before = everything()) %>%
filter(V1 == "a") %>%
select(sequence)
sequence
1 No304
2 No306
数据(来自ape
read.dna docs)
library(ape)
cat(">No305",
"NTTCGAAAAACACACCCACTACTAAAANTTATCAGTCACT",
">No304",
"ATTCGAAAAACACACCCACTACTAAAAATTATCAACCACT",
">No306",
"ATTCGAAAAACACACCCACTACTAAAAATTATCAATCACT",
file = "exdna.fas", sep = "\n")
example <- read.dna("exdna.fas", format = "fasta", as.character = TRUE)
colnames(example) <- paste0("V", 1:ncol(example))
example
V1 V2 V3 V4 ...
No305 "n" "t" "t" "c"
No304 "a" "t" "t" "c"
No306 "a" "t" "t" "c"