如何更改r中的异构双字母
我有一个数据框:如何更改r中的异构双字母,r,R,我有一个数据框: DF = read.table(text="S01 S02 S03 S04 S05 S06 TT CC TT CT TT 00 AC AA AC CC AA AA CC TC CC TT CC 00 CC AC CC AC AA CC GG 00 TG TT G
DF = read.table(text="S01 S02 S03 S04 S05 S06
TT CC TT CT TT 00
AC AA AC CC AA AA
CC TC CC TT CC 00
CC AC CC AC AA CC
GG 00 TG TT GG TG
GG GA GG GA GG GG", header=T, stringsAsFactors=F)
我希望以更快速的方式将所有异构值(双字母)更改为双“00”。
预期的结果是:
S01 S02 S03 S04 S05 S06
TT CC TT 00 TT 00
00 AA 00 CC AA AA
CC 00 CC TT CC 00
CC 00 CC 00 AA CC
GG 00 00 TT GG 00
GG 00 GG 00 GG GG
感谢您的帮助 可以使用负的前瞻正则表达式
as.data.frame(gsub("^(.)(?!\\1).$","00", as.matrix(DF), perl=T))
# S01 S02 S03 S04 S05 S06
# 1 TT CC TT 00 TT 00
# 2 00 AA 00 CC AA AA
# 3 CC 00 CC TT CC 00
# 4 CC 00 CC 00 AA CC
# 5 GG 00 00 TT GG 00
# 6 GG 00 GG 00 GG GG
我假设这是基因数据。这使得构建所有异构碱基对变得容易,并使用regex替换它们:
bases <-c("A","C","G","T")
b1 <- rep(bases, 4)
b2 <- rep(bases, each=4)
hetero<- paste0(b1[b1!=b2],b2[b2!=b1])
DF[] <- lapply(DF,gsub, pattern=paste0(hetero,collapse="|"),replacement="00")
base由于您表示希望使用快速解决方案,我尝试避免使用正则表达式,而是替换级别:
ex <- expand.grid(c("A","T","C","G"),c("A","T","C","G"))
ex <- ex[ex[1]!=ex[2],]
het.combs <- apply(ex,1,function(i) {paste0(i[1],i[2])} )
map <- setNames( rep("00",length(het.combs)) , het.combs )
fac.df<- lapply(DF, as.factor)
fac.df <- lapply(fac.df, function(i){levels(i)[levels(i) %in% names(map)] <- map[levels(i)[levels(i) %in% names(map)]];i } )
DF <- as.data.frame(fac.df)
ex只需创建一个“纯合”碱基向量,并使用它来索引数据。不幸的是,这种索引只适用于矩阵(而不是数据帧),因此我们相应地转换数据
bases = c('A', 'C', 'G', 'T')
homozygous = apply(cbind(bases, bases), 1, paste, collapse = '')
DF = as.matrix(DF)
DF[! DF %in% homozygous] = '00'
或者,您只需在数据帧的每一列上使用ifelse
。事实上,这种方法比矩阵方法简单,而且可能更快。这里最突出的部分是,您根本不需要使用正则表达式——事实上,根本没有理由求助于正则表达式进行精确匹配
DF = data.frame(lapply(DF, function (x) ifelse(x %in% homozygous, x, '00')))
首先,我要感谢Heroka的基准比较、David更快的解决方案和MrFlick简洁的脚本。我也感谢所有其他答案。基于您的解决方案,我有一个更快速的解决方案,它结合了Flick先生和David H的解决方案。读取DF
时,stringsAsFactors=T
DF <- data.frame(lapply(DF, function(x) {
levels(x) <- gsub("^(.)(?!\\1).$","00", levels(x), perl=T)
return(x)
}))
DF您尝试了什么?为什么它不起作用?一旦定义了hetero
,你也可以这样做:m这个方法很好,但是你的het.combs
缺少很多组合,即所有的i[1]>i[2]
。关于这束正则表达式的最快答案非常复杂。我有一个解决办法。谢谢
DF = data.frame(lapply(DF, function (x) ifelse(x %in% homozygous, x, '00')))
DF <- data.frame(lapply(DF, function(x) {
levels(x) <- gsub("^(.)(?!\\1).$","00", levels(x), perl=T)
return(x)
}))