R通配符数据框合并

时间:2015-07-27 08:47:29

标签: regex r merge dataframe

我正在尝试合并数据框和向量,而不是通过列中的精确字符串匹配,而是通过通配符字符串匹配。澄清一下,比方说你有这个数据框:

v <-data.frame(X1=c("AGTACAGT","AGTGAAGT","TGTA","GTTA","GAT","GAT"),X2=c(1,1,1,1,1,1))
#         X1 X2
# 1 AGTACAGT  1
# 2 AGTGAAGT  2
# 3     TGTA  3
# 4     GTTA  4
# 5      GAT  5
# 6      GAT  6

我想通过为每个AGT.{3}GT.{T|G}TAGAT模式创建不同的颜色来创建数据框,并创建一个显示该颜色的新列X3 。所以像这样:

#         X1 X2        X3
# 1 AGTACAGT  1 "#FE7F01"
# 2 AGTGAAGT  2 "#FE7F01"
# 3     TGTA  3 "#FE7F00"
# 4     GTTA  4 "#FE7F00"
# 5      GAT  5 "#FE8002"
# 6      GAT  6 "#FE8002"

到目前为止,我使用它来为每个级别创建颜色,但我不知道如何计算有多少“通配符级别”而不是奇异级别:

x <- nlevels(v$X1)
x.colors2 <- colorRampPalette(brewer.pal(8,"Paired"))(x)
G <- data.frame("X1"=levels(v$X1),"X3"=x.colors2)
v <- merge(v,G)

1 个答案:

答案 0 :(得分:1)

这是一个解决方案。

查找模式:

pat <- c("^AGT.{3}GT$", "^.(T|G)TA$", "^GAT$")
n <- length(pat)
indList <- lapply(pat, grep, v$X1)

生成颜色:

library(RColorBrewer)
col <- colorRampPalette(brewer.pal(8, "Paired"))(n)

为数据框添加颜色:

colFull <- rep(col, sapply(indList, length))
v$color <- colFull[order(unlist(indList))]

结果:

v
#         X1 X2   color
# 1 AGTACAGT  1 #A6CEE3
# 2 AGTGAAGT  1 #A6CEE3
# 3     TGTA  1 #979C62
# 4     GTTA  1 #979C62
# 5      GAT  1 #FF7F00
# 6      GAT  1 #FF7F00