Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在文本中间找到R的序列?_R_Regex - Fatal编程技术网

如何在文本中间找到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