当我们有像这样的SNP数据时,
1:168045465:C_T
1:2804278:C_G
14:88571933:C_T我们如何将其划分为染色体,位置,等位基因1,等位基因2(例如,1,168045465,C,T)
发布于 2020-11-05 09:34:59
您可以使用一个简单的函数来为您重新格式化:
x = c("1:168045465:C_T", "1:2804278:C_G", "14:88571933:C_T")
refmt = function(snp){
temp1 = unlist(strsplit(snp, ":"))
temp2 = unlist(strsplit(temp1[3],"_"))
temp = c(Chr = temp1[1], pos = temp1[2], a1 = temp2[1], a2 = temp2[2])
return(temp)
}
op = as.data.frame(t(sapply(x, refmt)))这会产生:
> op
Chr pos a1 a2
1:168045465:C_T 1 168045465 C T
1:2804278:C_G 1 2804278 C G
14:88571933:C_T 14 88571933 C T发布于 2020-11-05 09:10:34
我们可以使用tidyr的extract通过正则表达式将数据提取到不同的列中。
tidyr::extract(df, V1, c('chromosome', 'position', 'allele1', 'allele2'),
'(\\d+):(\\d+):(.*)_(.*)')
# chromosome position allele1 allele2
#1 1 168045465 C T
#2 1 2804278 C G
#3 14 88571933 C T您还可以在基本R strcapture中使用相同的正则表达式
proto <- data.frame(chromosome=integer(), position=integer(),
allele1=character(),allele2 = character())
strcapture('(\\d+):(\\d+):(.*)_(.*)', df$V1, proto)data
df <- structure(list(V1 = c("1:168045465:C_T", "1:2804278:C_G", "14:88571933:C_T"
)), class = "data.frame", row.names = c(NA, -3L))https://stackoverflow.com/questions/64689787
复制相似问题