通过粘贴与 R 中字符串的一部分匹配的所有列来创建新列

问题描述 投票:0回答:1

我有一个从文件中读取的数据帧,该文件以制表符分隔,但其中有一列以分号分隔。此列包含我感兴趣的大部分实际变量,但它未排序,因为某些行包含比其他行更多的信息,并且某些行具有重复值。然而,感兴趣的变量确实包含一个标识符作为其字符串的 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?

r dataframe grepl
1个回答
0
投票

使用 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
© www.soinside.com 2019 - 2024. All rights reserved.