簡體   English   中英

解析字符串計數並刪除r中不常見的字符

[英]Parsing through a string counting and removing infrequent characters in r

所以,我有一個像這樣的文件。

"1" "4" "10"     "11111111111111"
"2" "10" "22"    "11111111110111"
"3" "10" "295"   "11111111111100"
"4" "10" "584"   "11010000000000"
"5" "10" "403"   "11111111110111"
"6" "10" "281"   "11110101011110"
"7" "10" "123"   "11100000100100"
"8" "10" "127"   "11111111111111"
"9" "10"  "79"   "11110111111111"
"10" "10" "1030" "11110000000100"
................................

我想從這個文件中刪除那些行,這些行在特定行的第4列的字符串中小於4'1'。 例如,第4行包含字符串“11010000000000”。 字符串只有3'1',所以我想從文件中刪除這一行。

PS:我想到的一種方法是將字符串轉換為單個字符並將它們粘貼到特定行的不同列中,然后刪除那些小於4'1'的行。 有沒有其他直接的方法可以做到這一點?

更好的字符串處理包(如“stringi”)通常會有一個功能來計算某些模式的出現次數:

library(stringi)
stri_count_fixed(str=mydf$V4, pattern="1")
#  [1] 14 13 12  3 13 10  5 14 13  5

但你也可以在R基地做到這一點。

vapply(regmatches(mydf$V4, gregexpr("1", mydf$V4)), length, 1L)
#  [1] 14 13 12  3 13 10  5 14 13  5

然后,您可以使用基本比較運算符將結果向量用於子集。

刪除零並保留剩下的行至少包含4個字符的行。 這里我們假設數據位於名為DF的數據框中,其第四列的名稱為V4

subset(DF, nchar(gsub("0", "", V4)) >= 4)

或者更快但可能稍微不那么可讀:

DF[nchar(gsub("0", "", DF$V4)) >= 4, ]

添加第二個變體。

這是使用正則表達式的基本R中的另一個選項:

min.num <- 4
d[grepl(paste(rep(1, min.num), collapse='.*'), d[[4]]), ]

#    V1 V2   V3             V4
# 1   1  4   10 11111111111111
# 2   2 10   22 11111111110111
# 3   3 10  295 11111111111100
# 5   5 10  403 11111111110111
# 6   6 10  281 11110101011110
# 7   7 10  123 11100000100100
# 8   8 10  127 11111111111111
# 9   9 10   79 11110111111111
# 10 10 10 1030 11110000000100

基准測試結果:

library(microbenchmark)
library(stringi)

grothendieck <- function(DF) subset(DF, nchar(gsub("0", "", V4)) >= 4)
plourde <- function(d) d[grepl(paste(rep(1, 4), collapse='.*'), d[[4]]), ]
mahto1 <- function(mydf) mydf[stri_count_fixed(str=mydf$V4, pattern="1") > 3, ]
mahto2 <- function(mydf) mydf[vapply(regmatches(mydf$V4, gregexpr("1", mydf$V4)), length, 1L) > 3, ]

microbenchmark(grothendieck(d), plourde(d), mahto1(d), mahto2(d))

# Unit: microseconds
#             expr     min      lq  median      uq   max neval
#  grothendieck(d)  2895.7  2979.9  3003.8  3043.3  3444   100
#       plourde(d)  1280.2  1299.5  1317.6  1341.1  1542   100
#        mahto1(d)   518.2   532.3   545.8   554.5  1269   100
#        mahto2(d) 25465.3 27409.6 28447.0 29858.6 45734   100

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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