Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改r中的异构双字母_R - Fatal编程技术网

如何更改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)
}))