我正在尝试合并数据框和向量,而不是通过列中的精确字符串匹配,而是通过通配符字符串匹配。澄清一下,比方说你有这个数据框:
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}TA
,GAT
模式创建不同的颜色来创建数据框,并创建一个显示该颜色的新列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)
答案 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