Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.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_Dplyr - Fatal编程技术网

R 过滤模式上的行和列中的位置

R 过滤模式上的行和列中的位置,r,regex,dplyr,R,Regex,Dplyr,我需要帮助完成这项任务。我有一个数据帧,其中有说话人ids和他们在对话中的语音: df <- data.frame( line = 1:10, id = c("A", "A", "B", NA, "A", "B", "B", "B", "B", "B"), speech = c("hi&qu

我需要帮助完成这项任务。我有一个数据帧,其中有说话人
id
s和他们在对话中的
语音

df <- data.frame(
  line = 1:10,
  id = c("A", "A", "B", NA, "A", "B", "B", "B", "B", "B"),
  speech = c("hi", "how are you [Larry]?", "[uh]", "(0.123)", "I'm fine [you 'n Mary] how's it [goin]?", "[erm]", "(0.401)", "well", "(0.555)", "y'know what it's like")
)
我尝试过这个(过滤太少):

我试过这个(过滤太多):


编写一个函数,将行号返回到每个组的子集,并将其应用于每个
id

library(dplyr)

return_rows <- function(x) {
  if(grepl('\\[.*\\]', x[1]) && length(x) > 1) return(1:grep('\\(.*\\)', x)[1])
  else return(0)
}

df %>% group_by(id) %>% slice(return_rows(speech))

#   line id    speech 
#  <int> <chr> <chr>  
#1     3 B     [uh]   
#2     6 B     [erm]  
#3     7 B     (0.401)
df %>% group_by(group = data.table::rleid(id)) %>% slice(return_rows(speech))

哦,那是个错误!非常感谢您的关注!该功能可以在同一组中容纳多个连续的
[…]
,对吗?否。如果第一个值具有
[…]
,它将从第1行返回第一个
(…)
。但在实际数据集中,在同一组中有1-4个
[…]
。对于实际数据集,代码不起作用:它无法拾取
(…)
值。我检查过:在
df
中,即使同一组中有多个连续的
[…]
,您的代码也能正常工作。是否可以使用
group\u by(id)
而不是
group\u by(grp=rleid(id))
设置代码?是的,使用
rleid进行更改应该可以。我应该用它编辑答案吗?
df %>% 
  group_by(grp = rleid(id)) %>% 
  filter(grepl("^\\[.*?\\]$", first(speech)) & !grepl("^\\(\\d\\.\\d{3})$|^\\w+", speech))
library(dplyr)

return_rows <- function(x) {
  if(grepl('\\[.*\\]', x[1]) && length(x) > 1) return(1:grep('\\(.*\\)', x)[1])
  else return(0)
}

df %>% group_by(id) %>% slice(return_rows(speech))

#   line id    speech 
#  <int> <chr> <chr>  
#1     3 B     [uh]   
#2     6 B     [erm]  
#3     7 B     (0.401)
df %>% group_by(group = data.table::rleid(id)) %>% slice(return_rows(speech))