[英]Subset all 3 digit numbers and collapse them with a separator in a data frame. R
我正在格式化數據集,因此每個條目的主要標記都具有adegenet格式,例如:
Loci1
###/###
208/210
200/204
198/208
其中#代表任何數字(數字是鹼基對的等位基因大小)。 我的數據有一些純合的條目(所有3位整數,沒有分隔符),其形式為:
Loci1
###
208
198
我打算使用sep='/'
將3位數字的字符串paste
到其自身以產生第一種格式。 我試圖通過查找所有非###/###
並使用表匹配來否定匹配,來嘗試使用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...
在子集之后,我可以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
您可以只用分隔符和副本替換3位數的項目:
sub("^(...)$", "\\1/\\1", Loci1)
將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
(不確定“粘貼部分”應該指的是什么,但是我認為這是您提出問題的意圖)
如果數值的位數可能不同,則使用模式參數,例如"^([0-9]{1,9})$"
使用grep/paste
的選項,
m1 <- as.matrix(score2)
indx <- grep('^...$', m1)
m1[indx] <- paste(m1[indx], m1[indx], sep="/")
as.data.frame(m1)
# 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
或不轉換為matrix
,可以使用lapply
完成
score2[] <- lapply(score2, function(x) ifelse(grepl('^...$', x),
paste(x, x, sep="/"),x))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.