代码之家  ›  专栏  ›  技术社区  ›  dbro970

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

  •  0
  • dbro970  · 技术社区  · 3 周前

    我有一个数据帧,它是从一个以制表符分隔的文件中读取的,但其中有一列以分号分隔。此列包含我感兴趣的大多数实际变量,但它没有排序,因为有些行包含的信息比其他行多,有些行具有重复的值。然而,感兴趣的变量确实包含一个标识符作为其字符串的一部分,例如“gene-eno”。

    对于每一行,我想识别并粘贴所有与给定标识符匹配的值,如下所示:

    当前数据帧:

    A列 V9_01 V9_02
    cd 1 索引123 基因“pla”
    cd 2 基因“dah”
    cd 3 基因“废话” 地点:456
    cd 4 基因“do” 基因“rah”
    cd 5 索引127 位置893

    所需的数据帧:

    A列 V9_01 V9_02 基因名称(_N)
    cd 1 索引123 基因“pla” 基因“pla”
    cd 2 基因“dah” 基因“dah”
    cd 3 基因“废话” 地点:456 基因“废话”
    cd 4 基因“do” 基因“rah” 基因“do”,基因“rah”
    cd 5 索引127 位置893 NA

    我使用以下代码在原始文件中读取当前数据帧:

    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?

    1 回复  |  直到 3 周前
        1
  •  1
  •   Andre Wildberg    3 周前

    一种方法 基本R 使用 grep ,正在搜索 基因

    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