我有一个 Dataframe ,看起来像这样:
channel start.time stop.time vp duration X id overlaps
1: 4_speech 14.183 16.554 CH1 2.371 NA 165 1_hands_CH1_1.145;2_body_CH1_1.883;2_body_N_14.272;2_body_N_4.825
2: 4_speech 21.196 22.259 CH1 1.063 NA 166 1_hands_N_1.417;2_body_CH1_1.075;2_body_N_5.485
3: 4_speech 28.001 31.518 CH1 3.517 NA 167 1_hands_CH1_3.557;1_hands_CH2_1.75;2_body_CH1_3.445;2_body_N_3.519
4: 4_speech 34.867 36.549 CH1 1.682 NA 168 2_body_CH1_3.308
5: 4_speech 41.019 42.265 CH1 1.246 NA 169 1_hands_CH1_4.896;1_hands_N_0.663;2_body_CH1_5.288
6: 4_speech 55.262 57.800 CH1 2.538 NA 170 2_body_CH1_2.494;2_body_N_6.571
前6列显示有关特定观测的信息,第7列"重叠"显示与此数据框中的观测同时出现的不同数据框中的其他观测的列表。重叠列中的每个观测的结构如下:例如,行1中的"overlaps"中的第一个观测示出了"1_hands"是通道,"CH1"是vp(一种值),并且1.145是该观测的持续时间。
我想要一个给定观测类型的所有持续时间的总和。我可以用下面的代码来获得这个结果,该代码改编自堆栈用户on a question I previously asked about how to get the overlaps data in the first place.提供的答案
library(data.table)
library(stringr)
setDT(speech_rows)
speech_rows[, id := .I]
setkey(speech_rows, id)
#self join on subset by row
speech_rows[speech_rows, durs := {
temp <- df[!id == i.id & start.time < i.stop.time & stop.time > i.start.time & channel == "1_hands", ]
sum(temp$duration)
}, by = .EACHI]
这将添加另一列'durs',该列应该显示附加到重叠列中'1_hands'字符串的所有数值的总持续时间。因此产生以下内容(删除前6列以节省空间):
overlaps durs
1: 1_hands_CH1_1.145;2_body_CH1_1.883;2_body_N_14.272;2_body_N_4.825 0.000
2: 1_hands_N_1.417;2_body_CH1_1.075;2_body_N_5.485 1.417
3: 1_hands_CH1_3.557;1_hands_CH2_1.75;2_body_CH1_3.445;2_body_N_3.519 1.750
4: 2_body_CH1_3.308 0.000
5: 1_hands_CH1_4.896;1_hands_N_0.663;2_body_CH1_5.288 5.559
6: 2_body_CH1_2.494;2_body_N_6.571 0.000
但是有一个问题,sum()函数并没有捕获所有相关的字符串,在第1行,有这样一个字符串:"1_hands_CH1_1.145",它是该行中唯一的"1_hands"字符串,因此第1行durs下的值应为"1.145"。但由于某种原因,函数忽略了它。在第2行中,durs和是正确的。在第3行中,它只计算一个1_hands值,并忽略另一个。在第5行中,它正确地找到了两个1_hands值并将它们加在一起。第4行和第6行具有正确的"durs"值,因为其中没有1_hands观测值。
这非常奇怪,我不知道它有时能正确地检测到数值,但有时却不能。
问题#2:我无法指定除"1_hands"之外的其他内容,我真正想做的是获取所有1_hands_CH1值的持续时间之和,而不是所有1_hands值。为此,我假设您只需要更改"channel == 1_hands"中的字符串
temp <- df[!id == i.id & start.time < i.stop.time & stop.time > i.start.time & channel == **"1_hands"**, ]
但如果我将其更改为类似"1_hands_CH1"的值,则所有durs值都将为零,不能超过"1_hands"。
总之,我想知道为什么数学不能像我希望的那样工作,为什么我不能选择更具体的字符串。
1条答案
按热度按时间nmpmafwu1#
这里有一种方法,你可以使用tidyverse从overlaps列中获取持续时间。你可以设置
text_string
等于你想要的持续时间。我已经提供了一些如何输入文本字符串的例子。下面的例子返回所有 “1_hands” 观测的持续时间。如果你只想要 “1_hands_CH1” 的持续时间,那么你只需要设置text_string <- "1_hands_CH1"
。