如何在文本中间找到R的序列?
假设有一个字符串如何在文本中间找到R的序列?,r,regex,R,Regex,假设有一个字符串t和f,我们如何使用grep函数来找到模式,比如说,从f开始并在f中停留一段时间,然后转到t,我想计算它在t中停留的次数 a <- "fffftttfff" b <- "fttttttfff" c <- "tttttttttt" d <- "fffffffftf" path_ <- c(a,b,c,d) ID <- 1:4 tf_dt <- data.table("ID" = ID,"path" = path_) tf_dt I
t
和f
,我们如何使用grep函数来找到模式,比如说,从f
开始并在f
中停留一段时间,然后转到t
,我想计算它在t
中停留的次数
a <- "fffftttfff"
b <- "fttttttfff"
c <- "tttttttttt"
d <- "fffffffftf"
path_ <- c(a,b,c,d)
ID <- 1:4
tf_dt <- data.table("ID" = ID,"path" = path_)
tf_dt
ID path
1: 1 fffftttfff
2: 2 fttttttfff
3: 3 tttttttttt
4: 4 fffffffftf
dt_raw <- tf_dt[,-1]
s <- paste0(as.vector(t(dt_raw)), collapse = "")
v <- substring(s,seq(1,nchar(s)-9,10), seq(10,nchar(s),10))
idx <- grep("^f*f.+t",v)
dt_final <- data.frame("ID" = tf_dt$ID, count = FALSE, time = NA)
dt_final$count[idx] <- TRUE
dt_final$time[idx] <- ???
更多尝试:
#If I do gsub("^f*f+t*","",v) it gives me the last string that I want to remove
#But I cant do something like
nchar(gsub("^f*f","",gsub("gsub("^f*f+t*","",v)$",""v)))
预期产出:
tf_count <- c(TRUE,TRUE,FALSE,TRUE)
tf_time <- c(3,6,NA,1)
output <- data.table("ID" = ID, "count" = tf_count,"time_taken" = tf_time)
# ID count time_taken
# 1: 1 TRUE 3
# 2: 2 TRUE 6
# 3: 3 FALSE NA
# 4: 4 TRUE 1
tf\u count一种方法是在移除第一组f
后找出t
的数量,这可以通过
library(data.table)
tf_dt[, time_taken:= NA_integer_]
tf_dt[grep('^f', path), time_taken := nchar(sub('^f*(t{1,}).*', '\\1',path))]
tf_dt
# ID path time_taken
#1: 1 fffftttfff 3
#2: 2 fttttttfff 6
#3: 3 tttttttttt NA
#4: 4 fffffffftf 1
如果您对stringr
和tidyverse
解决方案感兴趣,请尝试以下代码。我从Ronak Shah的精彩回答中借用了一段代码“^f*(t{1,})”
:
tf_dt %>%
mutate(count = str_detect(path, "ft"),
time_taken = ifelse(count, str_count(str_extract(path, "^f*(t{1,})"), "t"), NA))
在base中使用grepl
和gsub
的解决方案,正如您在问题中已经尝试过的那样
tf_count <- grepl("^f+t+", tf_dt$path)
tf_time <- nchar(gsub("^f+(t+).*","\\1",tf_dt$path))
tf_time[!tf_count] <- NA
output <- data.frame("ID" = ID, "count" = tf_count,"time_taken" = tf_time)
output
# ID count time_taken
#1 1 TRUE 3
#2 2 TRUE 6
#3 3 FALSE NA
#4 4 TRUE 1
tf\u此解决方案的一个问题可能是,如果存在类似“fffffffftftt”
的字符串,则此解决方案将失败。如果我正确理解OP,在这种情况下,他们需要回答为1。但我可能错了。@RonakShah,这是真的。从OP中我不清楚这应该是1
还是3
。对于这种情况,代码将返回3
。如果需要1
,代码可以被修复。@ZhiqiangWang在stringr()
中怎么做如果我需要1在这种情况下,我不太熟悉tidyverse
,stringr
的stru count
使用正则表达式模式。我从@RonakShah那里借了一段代码,编辑了我的答案。对于像“fffffffftftt”
这样的输入,您期望的输出是什么?应该是1还是3?应该是1,很抱歉没有说清楚,所以让我尽可能多地理解它,因为我不确定代码的某些部分。第一行,我们试图找到一种模式,其中字符串的模式以f
开头,至少有1个f
,然后至少有1个t
。第二行,我们首先使用gsub
替换前面提到的字符串,然后
引用任何不是t
(?)到“
”的字符,然后它到达我不太明白的部分,“\\1”
做什么?。在这之后,我明白了所有的一切,只是这一部分在逃避我。感谢\\1
写入(t+
中的内容。
tf_count <- grepl("^f+t+", tf_dt$path)
tf_time <- nchar(gsub("^f+(t+).*","\\1",tf_dt$path))
tf_time[!tf_count] <- NA
output <- data.frame("ID" = ID, "count" = tf_count,"time_taken" = tf_time)
output
# ID count time_taken
#1 1 TRUE 3
#2 2 TRUE 6
#3 3 FALSE NA
#4 4 TRUE 1