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))