【发布时间】:2021-06-03 03:32:46
【问题描述】:
我有一个具有不同speakers 和utterances 的数据框,其中重叠发生在[...] 中; df 还包含 starttime_ms 和 endtime_ms 值:
df <- data.frame(
speaker = c("A", "B", "B", "B", "C", "C", "B", "A"),
utterance = c("hi [there] long time no [see] how're things", "[howdy]",
"[yeah]", "we're [good]", "[great]", "[really]", "yeah [fine]", "[and y]ourself?"),
starttime_ms = c(10, 25, 444, 1133, 1400, 1567, 1800, 1974),
endtime_ms = c(1100, 125, 555, 1566, 1566, 1700, 2000, 2111)
)
我需要过滤那些行 (i) utterance 完全(从头到尾)包含 [...] 表达式和 (ii) endtime_ms 小于 endtime_ms 通过 prior扬声器。
预期结果是这样的:
# A tibble: 4 x 5
# Groups: grp [2]
speaker utterance starttime_ms endtime_ms grp
<chr> <chr> <dbl> <dbl> <int>
1 B [howdy] 25 125 2
2 B [yeah] 444 555 2
我可以根据条件(i)过滤:
library(data.table)
library(dplyr)
df %>%
group_by(grp = rleid(speaker)) %>%
filter(grepl("^\\[[^][]+\\]$", utterance))
但我不知道如何实现条件 (ii);使用& lag(endtime_ms) > endtime_ms 作为filter 的另一个条件不起作用。
【问题讨论】:
-
"
endtime_msis small" 似乎不对:555 不小于 125。 -
(看来您使用的是
data.table::rleid,最好包含它。) -
澄清一下,“
endtime_ms小于前一位发言者的endtime_ms”是指在按第一个条件过滤之前分组数据? -
@LeonardoViotti 正确!