所以,我有一个像这样的文件。
"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'的行。有没有其他直接的方法可以做到?
答案 0 :(得分:5)
更好的字符串处理包(例如" 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
然后,您可以使用基本比较运算符将该结果向量用于子集。
答案 1 :(得分:3)
删除零并保留剩下的行至少包含4个字符的行。在这里,我们假设数据位于名为DF
的数据框中,其第四列的名称为V4
:
subset(DF, nchar(gsub("0", "", V4)) >= 4)
或者更快但可能稍微不那么可读:
DF[nchar(gsub("0", "", DF$V4)) >= 4, ]
已添加第二种变体。
答案 2 :(得分:1)
这是使用正则表达式的基本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