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

R数据框sum函数未正确捕获数据及精准筛选问题

问题分析与解决方案

问题原因

1. sum未正确统计所有1_hands时长

当前代码依赖df中的时间重叠条件筛选,但overlaps列列出的观测不一定都满足与当前speech行的时间重叠规则。例如行1的1_hands_CH1_1.145可能其时间范围和该行的[14.183,16.554]无重叠,因此被过滤;行3的两个1_hands观测中仅一个符合时间条件,导致只统计到一个值。

2. 无法筛选1_hands_CH1类型

channel列存储的是4_speech这类一级分类,而1_hands_CH1是overlaps字段里的细分标识,并非channel列的有效值。直接用channel == "1_hands_CH1"会因无匹配行导致sum返回0。

解决方案

方案1:直接解析overlaps列(高效推荐)

既然overlaps已明确列出当前行的所有共现观测,直接拆分该列提取目标时长即可,无需再去原始表做时间匹配:

library(data.table)
library(stringr)

setDT(speech_rows)

# 计算所有1_hands类的总时长
speech_rows[, total_1hands := {
  obs_list <- str_split(overlaps, ";")[[1]]
  hands_obs <- str_subset(obs_list, "^1_hands")
  if(length(hands_obs) == 0) 0 else sum(as.numeric(str_extract(hands_obs, "_\\d+\\.\\d+$")))
}, by = .I]

# 精准筛选1_hands_CH1类型的总时长
speech_rows[, total_1hands_CH1 := {
  obs_list <- str_split(overlaps, ";")[[1]]
  hands_ch1_obs <- str_subset(obs_list, "^1_hands_CH1")
  if(length(hands_ch1_obs) == 0) 0 else sum(as.numeric(str_extract(hands_ch1_obs, "_\\d+\\.\\d+$")))
}, by = .I]

方案2:修正自连接逻辑(基于原始表时间匹配)

若必须严格依赖时间重叠规则计算,需根据df的字段结构调整筛选条件:

  • 若df的channel列包含1_hands_CH1这类细分值:
speech_rows[speech_rows, durs_1hands_CH1 := {
  temp <- df[!id == i.id & start.time < i.stop.time & stop.time > i.start.time & channel == "1_hands_CH1"]
  sum(temp$duration, na.rm = TRUE)
}, by = .EACHI]
  • 若df的channel列是1_hands,vp列是CH1:
speech_rows[speech_rows, durs_1hands_CH1 := {
  temp <- df[!id == i.id & start.time < i.stop.time & stop.time > i.start.time & channel == "1_hands" & vp == "CH1"]
  sum(temp$duration, na.rm = TRUE)
}, by = .EACHI]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:15:33