我有一个从文件中读取的数据帧,该文件以制表符分隔,但其中有一列以分号分隔。此列包含我感兴趣的大部分实际变量,但它未排序,因为某些行包含比其他行更多的信息,并且某些行具有重复值。然而,感兴趣的变量确实包含一个标识符作为其字符串的 pat,例如“基因埃诺”。
对于每一行,我想识别并粘贴与给定标识符匹配的所有值,如下所示:
当前数据框:
A 栏 | V9_01 | V9_02 |
---|---|---|
CDS 1 | 索引123 | 基因“pla” |
CDS 2 | 基因“dah” | |
CDS 3 | 基因“废话” | 地点:456 |
CDS 4 | 基因“做” | 基因“rah” |
CDS 5 | 索引127 | 位置893 |
所需的数据框:
A 栏 | V9_01 | V9_02 | 基因_名称 |
---|---|---|---|
CDS 1 | 索引123 | 基因“pla” | 基因“pla” |
CDS 2 | 基因“dah” | 基因“dah” | |
CDS 3 | 基因“废话” | 地点:456 | 基因“废话” |
CDS 4 | 基因“做” | 基因“rah” | 基因“do”,基因“rah” |
CDS 5 | 索引127 | 位置893 | 不适用 |
我使用以下代码创建了当前数据帧以读取原始文件:
DP_GTF<-read.delim("E:/Genome_Files/GTF/DolosPig51524.gtf", sep = "\t", comment.char = "#", header = F) %>%
subset(V3=="CDS") %>%
#select(c("V9"))%>%
cSplit("V9",";")
我不确定如何获取所需的数据帧,但假设我需要对部分数据帧运行 grep?
使用 grep
的
base R方法,搜索 gene
transform(df, Gene_Name = apply(df[,-1], 1, \(x){
res <- toString(grep("gene", x, value=T))
replace(res, res == "", NA)}), check.names=F)
Column A V9_01 V9_02 Gene_Name
1 CDS 1 Index123 gene pla gene pla
2 CDS 2 gene dah gene dah
3 CDS 3 gene blah Location:456 gene blah
4 CDS 4 gene do gene rah gene do, gene rah
5 CDS 5 Index127 Location893 <NA>
与 dplyr 使用
c_across
与 rowwise
library(dplyr)
df %>%
rowwise() %>%
mutate(Gene_Name = toString(grep("gene", c_across(V9_01:V9_02), value=T)),
Gene_Name = replace(Gene_Name, Gene_Name == "", NA)) %>%
ungroup()
# A tibble: 5 × 4
`Column A` V9_01 V9_02 Gene_Name
<chr> <chr> <chr> <chr>
1 CDS 1 "Index123" gene pla gene pla
2 CDS 2 "" gene dah gene dah
3 CDS 3 "gene blah" Location:456 gene blah
4 CDS 4 "gene do" gene rah gene do, gene rah
5 CDS 5 "Index127" Location893 NA