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

