簡體   English   中英

子集所有3位數字,並在數據框中使用分隔符將其折疊。 [R

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM