【问题标题】:Replace certain columns in dataframe with corresponding names from another dataframe用另一个数据框中的相应名称替换数据框中的某些列
【发布时间】:2019-10-21 07:33:51
【问题描述】:

我有一个以 SRR 名称作为列标题的数据框,我想用另一个数据框中的相应 PI 名称替换它们,使用 dplyr

SRR 数据框:

CHR  POS  ALLELE  SRR6  SRR8  SRR9  SRR10
01   10   A,T     A     T     T     A
01   20   C,G     G     C     C     C
02   15   T       T     T     T     T

PI 数据框:

PI_NAME  SRR_NAME
PI1      SRR6
PI2      SRR7
PI3      SRR8
PI4      SRR9
PI5      SRR10

期望的输出:

CHR  POS  ALLELE  PI1   PI3   PI4   PI5
01   10   A,T     A     T     T     A
01   20   C,G     G     C     C     C
02   15   T       T     T     T     T

到目前为止,我已经尝试过这样的事情:

SRR %>%
   rename_at(vars(matches("SRR")), funs(str_replace(., ., PI$PI_NAME[PI$SRR == .])))

但还没有成功。

提前感谢您的帮助。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用命名key/value 向量来匹配列名并替换名称

    library(dplyr)
    SRR %>% 
       rename_at(vars(matches("SRR")), ~ setNames(PI$PI_NAME, PI$SRR_NAME)[.])
    #  CHR POS ALLELE PI1 PI3 PI4 PI5
    #1   1  10    A,T   A   T   T   A
    #2   1  20    C,G   G   C   C   C
    #3   2  15      T   T   T   T   T
    

    也可以翻译成base R

    i1 <- grep("SRR", names(SRR))
    names(SRR)[i1] <- setNames(PI$PI_NAME, PI$SRR_NAME)[names(SRR)[i1]]
    

    数据

    SRR <- structure(list(CHR = c(1L, 1L, 2L), POS = c(10L, 20L, 15L), ALLELE = c("A,T", 
    "C,G", "T"), SRR6 = c("A", "G", "T"), SRR8 = c("T", "C", "T"), 
        SRR9 = c("T", "C", "T"), SRR10 = c("A", "C", "T")), class = "data.frame",
           row.names = c(NA, 
    -3L))
    
    PI <- structure(list(PI_NAME = c("PI1", "PI2", "PI3", "PI4", "PI5"), 
        SRR_NAME = c("SRR6", "SRR7", "SRR8", "SRR9", "SRR10")), 
        class = "data.frame", row.names = c(NA, 
    -5L))
    

    【讨论】:

    • 简洁优雅。谢谢@akrun!
    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    相关资源
    最近更新 更多