用另一个数据框中的相应名称替换数据框中的某些列

时间:2019-06-05 18:54:19

标签: r dplyr

我有一个具有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 == .])))

但没有成功。

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分: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))