You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于负Trans_new值的对话注视数据裁剪(tidyverse求解)

对话提问阶段注视数据的裁剪处理(tidyverse方案)

需求说明

处理对话提问阶段的注视数据:

  • aoi_C_aoi 记录注视点
  • aoi_C_dur 记录注视时长
  • Utterance 为提问内容
  • 当回答早于提问结束时,Trans_new(提问与回答的时间差)为负值,需按时间顺序累加注视时长,耗尽abs(Trans_new)对应的裁剪时长后,截断最后一段有效注视时长,超出部分直接丢弃。

可复现数据

df <- data.frame(
  Sequ = c(55,77),
  Utterance = c("where...?", "what's...?"),
  Trans_new = c(-125, -333),
  aoi_C_aoi = c("B, *, A, *, B", "*, A"),       
  aoi_C_dur = c("59, 110, 72, 50, 100", "299, 401")
)

已完成的格式转换代码

以下代码完成了数据的长格式转换与行拆分:

df_processed <- df %>% 
  pivot_longer(matches("aoi"),
               names_to = c("Gaze_by", ".value"),
               names_pattern = "([ABC])_(.+)") %>%
  rename(Gaze_to = aoi) %>%
  mutate(Gaze_to = trimws(Gaze_to)) %>%
  separate_rows(c(Gaze_to, dur), sep = ", ", convert = TRUE)

裁剪处理的tidyverse解决方案

基于上述转换后的数据,按Sequ分组计算累计时长,完成裁剪逻辑:

library(tidyverse)

final_df <- df_processed %>%
  group_by(Sequ) %>%
  mutate(
    # 计算每行的累计注视时长
    cum_dur = cumsum(dur),
    # 提取需要裁剪的总时长
    cut_total = abs(Trans_new)
  ) %>%
  # 保留累计时长未耗尽裁剪时长的行,或需要截断的最后一行
  filter(cum_dur - dur < cut_total) %>%
  mutate(
    # 对最后一行截断时长,保留未超出裁剪时长的部分
    dur = if_else(cum_dur > cut_total, dur - (cum_dur - cut_total), dur)
  ) %>%
  # 移除辅助计算列
  select(-cum_dur, -cut_total) %>%
  ungroup()

期望输出

final_df
#>    Sequ Utterance  Trans_new Gaze_by Gaze_to   dur
#>   <dbl> <chr>          <dbl> <chr>   <chr>   <int>
#> 1    55 where...?       -125 C       B          59
#> 2    55 where...?       -125 C       *         110
#> 3    55 where...?       -125 C       A          72
#> 4    55 where...?       -125 C       *          25
#> 5    77 what's...?      -333 C       *         299
#> 6    77 what's...?      -333 C       A         68

内容的提问来源于stack exchange,提问作者Chris Ruehlemann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:18:22