基于负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
相关产品推荐
相关产品推荐

