子集所有3位数字并使用数据框中的分隔符折叠它们.[R

Pan*_*ito 1 regex r

我正在格式化数据集,因此每个条目都具有适用于共显性标记的adegenet格式,例如:

Loci1
###/###
208/210
200/204
198/208
Run Code Online (Sandbox Code Playgroud)

其中#代表任何数字(数字是碱基对中的等位基因大小).我的数据有一些纯合条目(所有3位整数,没有分隔符),其形式为:

Loci1
###
208
198
Run Code Online (Sandbox Code Playgroud)

我打算paste用3位数字串sep='/'来生成第一种格式.我已经尝试使用grep通过查找所有非###/###和使用表匹配否定匹配来对这些纯合条目进行子集化,例如:

a <- grep('\\b\\d{3}?[/]\\d{3}', score$Loci1, value =T )  # Subset all ###/###/
score[!(a %in% 1:nrow(score$Loci1)), ] # works but only on vectors...
Run Code Online (Sandbox Code Playgroud)

在我可以的子集之后paste.当我将其应用于数据框时会出现问题.grep似乎将数据框视为一个列表(部分原因)并返回具有匹配项的列.

简而言之,我怎样才能从数据框中走出######/###

自包含的数据示例:

score2 <- NULL
set.seed(9)
Loci1 <- NULL
Loci2 <- NULL
Loci3 <- NULL
for (i in 1:5) Loci1 <- append(Loci1, paste(sample(seq(from = 230, to=330,  by=3), 2, replace = F), collapse = '/'))
for (i in 1:5) Loci2 <- append(Loci2, paste(sample(seq(from = 230, to=330, by=3), 2, replace = F), collapse = '/'))
for (i in 1:5) Loci3 <- append(Loci3, paste(sample(seq(from = 230, to=330, by=3), 2, replace = F), collapse = '/'))

score2 <- data.frame(Loci1, Loci2, Loci3, stringsAsFactors = F)
score2[2,3] <- strsplit(score2[2,3], split = '/')[1]
score2[5,2] <- strsplit(score2[3,3], split = '/')[1]
score2[1,1] <- strsplit(score2[1,1], split = '/')[1]
score2[c(1, 4),c(2,3)] <- NA
score2
Run Code Online (Sandbox Code Playgroud)

42-*_*42- 5

您可以使用分隔符和副本替换3位数的项目:

 sub("^(...)$", "\\1/\\1", Loci1)
Run Code Online (Sandbox Code Playgroud)

使用lapply具有匿名函数:

data.frame( lapply(score2, function(x) sub("^(...)$", "\\1/\\1", x)  ) )
    Loci1   Loci2   Loci3
1 251/251    <NA>    <NA>
2 251/329 320/257 260/260
3 275/242 278/329 281/320
4 269/266    <NA>    <NA>
5 296/326 281/281 326/314
Run Code Online (Sandbox Code Playgroud)

(不确定"粘贴部分"应该引用什么,但我认为这是你的问题的意图)

如果数值可能具有不同的数字位数,那么使用模式参数 "^([0-9]{1,9})$"