我有一个具有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 == .])))
但没有成功。
在此先感谢您的帮助。
答案 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))